//--------------------------------------
// KVK-Erweiterung auf jquery-Basis
//
// Copyright by Uwe Dierolf, KIT-Bibliothek Karlsruhe
// März 2010
//--------------------------------------

// debugging = false;

kvk_cookie_alles    = 'kvk-cookie-alles';
kvk_cookie_kataloge = 'kvk-cookie-kataloge';
$(document).ready( kvk_init );

sessiontestname = "kvk-session"
cookie_domain = "ubka.uni-karlsruhe.de"

function kvk_init() {
    debug('kvk_init');
    loadForm()

    var form = document.forms[0]
    auto_fill_form(form)

    $('#auswahl_loeschen').bind('click', uncheckAllCatalogs );
    $('#clearFields').bind('click', clearFields );
    $('#KVK_FORM').bind('submit',saveForm);

    // $('#Verbuende').bind('click', toggle_verbuende );
    // $('#Buchhandel').bind('click', toggle_buchhandel );
    // $('#Verbuende').bind('click', toggleCatalogCheckboxes );
    // $('#Buchhandel').bind('click', toggleCatalogCheckboxes );
    $('.Katalogauswahl').bind('click', toggleCatalogCheckboxes );

    // Den Suchtext im Feld Freitextsuche selektieren, damit man ihn direkt Ã¼berschreiben kann
    $("#freitext").select();

    // jQuery UI
    $('#sortable').sortable({ stop: sortStop });
}       

function sortStop(event, ui) {
    doStatistics('changePrefsOrder')
    savePrefsOrder()
}

function savePrefsOrder() {
    // alert('savePrefsOrder')
    var savedPrefs = $('.savedPref')
    var orderedPrefs = []
    for (var i=0; i<savedPrefs.length; i++) {
	var id = savedPrefs[i].id
	id = 'kvk-' + id
	orderedPrefs.push(id)
    }
    mySetCookie('kvk-prefsOrder', orderedPrefs.toString())
}

function getPrefsOrder() {
    // alert('getPrefsOrder')
    var orderedPrefs = $.cookies.get('kvk-prefsOrder');
    if (!orderedPrefs || orderedPrefs == 'undefined') return Array()
    orderedPrefs = orderedPrefs.split(',')
    return orderedPrefs
}

// Fuer Sitzungskonzept: generiert Zufalls-Zeichenkette und schreibt
// versteckten Parameter
function generate_session() {
	// G%($F$!!! IE 5.0 generiert zwar jedesmal eine neue Sitzungsnummer,
	// sendet aber beim zweiten Abschicken trotzdem denselben versteckten
	// Parameter wie beim erstenmal -> Workaround
	if(document.all) session="X7YZ1GHU"
	else {
		session = ""
		var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
		var chars = str.split("")
		for (var i = 0; i < 8; i++)
			session += chars[Math.round(Math.random() * 35)]
	}
	document.write("<input type=\"hidden\" name=\"" + sessiontestname + "\" value=\"" + session + "\">")

	if (document.URL.indexOf(cookie_domain) < 0) {
	    // alert("schreibe cookie via cookie_relay Skript")
	    print_cookie_relay_image();
	}
}

// Gibt IMG-Tag auf das cookie_relay_script aus, um
// Sitzungs-Test-Cookie Domainuebergreifend zu setzen. "onSubmit"
// Aufruf scheint hier Probleme zu machen, Aufruf deshalb schon
// on_load via generate_session()
function print_cookie_relay_image() {
	document.write("<img src=\"" + cookie_relay_script + "?" + sessiontestname + "=" + session + "\">")
}


// ISBN beim Abschicken der Suchanfrage auf Gueltigkeit ueberpruefen.
// Soll dem Benutzer Tippfehler ersparen, aber trotzdem nicht die Freiheit
// nehmen, nach ungueltigen ISBNs suchen zu lassen.
function checkISBN(isbn) {
    var ungueltig = 0;

    if (isbn.length > 0) {
	var isbn_temp = isbn.replace(/[\s-]/g, "");

	if (isbn_temp.length == 13 && isbn_temp.search(/^\d+$/) != -1) {
	    // EAN
	    for (var i = 0; i < 13; i++) {
		ungueltig += (1 + 2 * (i % 2)) * isbn_temp.charAt(i);
	    }
	    ungueltig %= 10;

	} else if (isbn_temp.length != 10 || isbn_temp.search(/[^\dxX]/) != -1 || isbn_temp.search(/x./i) != -1) {
	    ungueltig = 1;
	} else {
	    for (var i = 0; i < 10; i++) {
		ungueltig += (10 - i) * isbn_temp.charAt(i).replace(/x/i, "10");
	    }
	    ungueltig %= 11;
	}
    }
    return !ungueltig || confirm("Die angegebene ISBN (" + isbn + ") ist ungueltig. Wollen Sie trotzdem fortfahren?");
}


// Setzt Sitzungs-Test-Cookie. Muss "onSubmit" aufgerufen werden,
// damit auch mehrere Suchmasken parallel benutzt werden koennen
function set_session() {
    document.cookie = sessiontestname + "=" + session + "; domain=ubka.uni-karlsruhe.de; path=/"
}

// Suchfelder loeschen
function clearFields() {
    $(":input[type=text]").attr("value",'');
    set_focus()
}                       

// Keinen Katalog auswÃ¤hlen
function uncheckAllCatalogs() {
    $(".katalog_checkboxen :input[type=checkbox]").attr('checked', false);

}

function uncheckNeuesFenster() {
    $("#neuesFensterCheckbox").attr('checked', false);
}

// Buttons fÃ¼r "Einstellung sicher/laden" in der Ã¼bergebenen Sprache "lang" drucken
function pref_buttons() {
    var lang = $(':input[name=lang]').val()
    var einstellungen = getStringRess('myCatalogs',lang)
    document.write('<tr><td class="spalten_hylib"><p class="thema" id="jTipp1" jTip="/kvk/kvk/kvk_jquery_tooltips.html Tipp1"><b>', einstellungen, '</b><br>');
    document.write("</p>");
    document.write('<div id="sortable" class="savedPrefs ui-sortable">');
    document.write("</div>");
    // hier werden per showPref die gespeicherten Katalogauswahlen platziert
    document.write('<div id="addPrefBtn"><img class="savePref"> neu</div>');
    document.write("</td></tr>");

    loadAllPrefs()
    setPropertiesAndEventsForPrefs()
    deleteIconsSetzen();
    addIconSetzen();

    // http://icons.iconarchive.com/icons/dryicons/simplistica/48/add-icon.png
    // http://icons.iconarchive.com/icons/dryicons/simplistica/48/delete-icon.png
}

function getJSONobject(stringOrObject) {
    if (typeof(stringOrObject) == 'string')
	return $.evalJSON(stringOrObject)
    else
	return stringOrObject
}
function loadAllPrefs() {
    var orderedPrefs = getPrefsOrder()
    var allKvkPrefs = $.cookies.filter('^kvk-pref-');
    var numberOfPrefs = orderedPrefs.length;
    if (numberOfPrefs > 0) {
	doStatistics('loadAllPrefs ' + numberOfPrefs)
    }
    for (var i=0; i<numberOfPrefs; i++) {
	var property = orderedPrefs[i]
	var pref = getJSONobject(allKvkPrefs[property])
	if (pref == undefined) continue
	// String-Casting, da timestamp intern als number behandelt 
	// wird und darauf match nicht funktioniert
	var timestamp = String(pref.timestamp)
	var text = pref.text
	if (! timestamp.match(/recent/)) showPref(timestamp,text)
    }
    // $.each(allKvkPrefs,showPrefHelper)
}

function loadAllPrefs_ORG() {
    var orderedPrefs = getPrefsOrder()
    var allKvkPrefs = $.cookies.filter('^kvk-pref-');
    for (var property in allKvkPrefs) {
	var pref = getJSONobject(allKvkPrefs[property])
	// String-Casting, da timestamp intern als number behandelt 
	// wird und darauf match nicht funktioniert
	var timestamp = String(pref.timestamp)
	var text = pref.text
	if (! timestamp.match(/recent/)) showPref(timestamp,text)
    }
    // $.each(allKvkPrefs,showPrefHelper)
}

function showPrefHelper(name,value) {
    value = getJSONobject(value)
    var text = value.text
    var timestamp = value.timestamp
    showPref(timestamp,text)
}

function saveForm() {
    savePref('recent','Letzte Auswahl')
    return true;
}

function loadForm() {
    var loadRecent = true
    loadPref(null,loadRecent)
}

function loadPref(event,loadDefault) {
    if (loadDefault == true) {
	var theID = 'pref-recent'
    } else {
	var theID = event.target.id;
    }
    var cookieName = 'kvk-' + theID
    // alert('loadPref theID=' + theID + ' cookieName=' + cookieName)
    uncheckAllCatalogs()
    uncheckNeuesFenster()
    // formValues ist bei jquery.cookies.2.0.1.js ein String
    // formValues ist bei jquery.cookies.2.2.0.js ein Objekt
    var cookieValue = $.cookies.get(cookieName);
    if (! cookieValue) return

    var cookieValue = getJSONobject(cookieValue)
    var formValues = getJSONobject(cookieValue.formValues)
    $('#KVK_FORM').values(formValues);
}

function setPropertiesAndEventsForPrefs() {
    $('.savedPref')
	.css({'padding': '2px 0'})
	.css({'cursor': 'pointer'})
	.attr('title','Katalogauswahl laden, Ã„ndern der Reihenfolge geht mit Drag and Drop')
	.bind('click',loadPref)
	.bind('mouseover',hilitePref)
	.bind('mouseout',unhilitePref)
}

function hilitePref(event) {
    // event.stopPropagation();
    var theID = event.target.id;
    if (theID == null || theID == "") return
    // if ($.browser.msie) return
    $('#' + theID).css({'background':'#EEEEEE'})
}

function unhilitePref(event) {
    // event.stopPropagation();
    var theID = event.target.id;
    if (theID == null || theID == "") return
    // if ($.browser.msie) return
    $('#' + theID).css({'background':''})
}

// ToDo: Icon rechts ausrichten
function deleteIconsSetzen() {
    $('.deletePref') 
	.css({'vertical-align': 'middle'})
	.attr('title','Katalogauswahl lÃ¶schen')
	.attr('width',18)
	.attr('src','http://www.ubka.uni-karlsruhe.de/kvk/kvk/icon-delete.gif')
	.bind('click',deletePref)
	// .attr('src','http://icons.iconarchive.com/icons/dryicons/simplistica/48/delete-icon.png')
}

function deletePref(event) {
    event.stopPropagation();
    var theID = event.target.id;
    var thePrefID = 'pref-'+theID.match(/([0-9]+)/)[0]
    var text = $('#' + thePrefID).text()
    var ok = confirm('Soll die Katalogauswahl "' + text + '"gelÃ¶scht werden?')
    if (!ok) return 
    doStatistics('deletePref')
    // alert('deletePref theID=' + theID + 'thePrefID=' + thePrefID)
    deletePrefCookie(thePrefID)
    $('#' + thePrefID).remove()
    savePrefsOrder()
}

function deletePrefCookie(thePrefID) {
    var cookieName = 'kvk-' + thePrefID
    // alert('deletePrefCookie ' + cookieName)
    myDeleteCookie(cookieName)
}

function addIconSetzen() {
    $('.savePref')
	.css({'vertical-align': 'middle'})
	.css({'cursor': 'pointer'})
	.css({'padding': '4px 0'})
	.attr('title','Neue Katalogauswahl speichern')
	.attr('width',18)
	.attr('src','http://www.ubka.uni-karlsruhe.de/kvk/kvk/icon-add.gif')
	.bind('click',addPref)
	// .attr('src','http://icons.iconarchive.com/icons/dryicons/simplistica/48/add-icon.png')
    $('#addPrefBtn')
	.css({'cursor': 'pointer'})
	.bind('mouseover',hilitePref)
	.bind('mouseout',unhilitePref)
	.bind('click',addPref)
}

function addPref(event) {
    event.stopPropagation();
    var timestamp = event.timeStamp
    var text = prompt('Wie wollen Sie die zu sichernden Einstellungen bezeichnen?','Name der Katalogauswahl')
    if (text == null) return
    // alert('text=' + text)
    savePref(timestamp,text)

    // Falls nun die Summe aller Cookies zu groÃŸ ist, kann es zu einem
    // 400-er Error, Bad Request kommen - dann muss die Einstellung wieder gelÃ¶scht werden

    var actualCookieSize = document.cookie.length
    if (document.cookie.length > 5000) {
        alert('Sie kÃ¶nnen derzeit keine weiteren Einstellungen sichern, da sonst Ihr Cookie zu groÃŸ wird');
	deletePrefCookie('pref-' + timestamp)
        return false
    }
    doStatistics('addPref ' + text)
    showPref(timestamp,text)
    savePrefsOrder()
}

// http://www.howtocreate.co.uk/tutorials/javascript/objects
function prefObject() {
    this.text = ""
    this.timestamp = ""
    this.formValues = ""
    this.toString = function () {
	return this.timestamp + ' ' + this.text + ' ' + this.formValues
    }

}

function mySetCookie(cookieName, cookieValue) {
    // var options = {expiresAt: new Date(2020, 0, 1) , path: location.pathname};
    var options = {expiresAt: new Date(2020, 0, 1)};
    $.cookies.set(cookieName, cookieValue, options);
}

function myDeleteCookie(cookieName) {
    $.cookies.del(cookieName)
}

function savePref(timestamp,text) {
    // alert('savePref ' + timestamp + ' ' + text)
    var katalogSelector = '.katalog_checkboxen :input[type=checkbox]:checked'
    var timeoutAndNewWindowSelector = '.morePrefs'
    var selector = katalogSelector + ',' + timeoutAndNewWindowSelector
    var formValues = $(selector).values();
    // in standard stehen die Default-Werte drin --> lÃ¶schen
    delete formValues['standard'];
    if (formValues == '' || formValues == null) return

    var pref = new prefObject()
    pref.text = text
    pref.timestamp = timestamp
    pref.formValues = $.toJSON(formValues)
    var cookieName = 'kvk-pref-' + timestamp
    var cookieValue =  $.toJSON(pref)
    mySetCookie(cookieName, cookieValue)
}

function showPref(timestamp,text) {
    // var html = '<div id="pref-@timestamp@" class="savedPref">@text@ <img id="delBtn-@timestamp@" class="deletePref"> </div>'
    var html = '<div id="pref-@timestamp@" class="savedPref"><img id="delBtn-@timestamp@" class="deletePref"> @text@</div>'
    html = html.replace(/@timestamp@/g,timestamp)
    html = html.replace('@text@',text)
    $('.savedPrefs').append(html)
    // $('#addPrefBtn').before(html)
    deleteIconsSetzen()
    setPropertiesAndEventsForPrefs()
}

// Name des Einstellungs-Cookies
// Dateiname aus der URL der Suchmaske ohne Erweiterung + "-prefs"
function cookie_name() {
    var s = "kvk-unknown";
    if (((location.pathname.search("/([^/]+)\\.[^/]*$") != -1) && (RegExp.$1 != "index")) || (location.pathname.search("/([^/]+)/[^/]*$") != -1)) {
	s = RegExp.$1;
    }
    return s + "-prefs";

    // Alter Code von Oliver Kern war:
    var name = location.pathname.substring(location.pathname.lastIndexOf("/") + 1)
    return name.substring(0, name.lastIndexOf(".")) + "-prefs"
}

function set_focus() { $("#freitext").select(); }


function toggle_verbuende(event) {
    var isChecked = $("#Verbuende").attr('checked');
    $('.istVerbund').attr('checked',isChecked);
}
function toggle_buchhandel() {
    var isChecked = $("#Buchhandel").attr('checked');
    $('.istBuchhandel').attr('checked',isChecked);
}
function toggleCatalogCheckboxes(event) {
    var theID = event.target.id;
    var isChecked = $("#" + theID).attr('checked');
    $(".ist" + theID).attr('checked',isChecked);
}

//---------------------------------------------------------
// String-Ressourcen
//---------------------------------------------------------

function getStringRess(label,lang) {
    var strings = {
	'myCatalogs' : {
	    'de' : 'Meine Kataloge',
	    'en' : 'My catalogs'
	},
	'prefs' : {
	    'de' : 'Einstellungen',
	    'en' : 'Preferences',
	    'fr' : 'Options',
	    'it' : 'Impostazioni'
	},
	'text1' : {
	    'de' : 'Der erste Text',
	    'en' : 'The first Text'
	}
    }
    strings = getJSONobject(strings)
    var str = strings[label][lang]
    // nimm englisch als Default
    if (! str) str = strings[label]['en']
    return str
}

//---------------------------------------------------------
// Debugging
//---------------------------------------------------------

function debug(txt) {
    // ohne window.debugging wird eine JS Error geworfen, 
    // falls debugging nicht deklariert wurde
    if (window.debugging != true) return;
    if (typeof(console) != 'undefined') console.log(txt);
    // else alert(txt);
}

// Falls mal ein selector-Ausdruck falsch ist, kann man so wenigstens 
// per debug-Aufruf erkennen, dass das wrapped set leer ist

(function($){
  $.fn.debugWrappedSet = function(txt) {
    // debug('this.size = ' + this.size());
    if (this.size() == 0) { 
	debug('wrappedSet is empty ! info=' + txt);
    }
    return this;
  }
}) (jQuery);


// Suchfelder der Maske automatisch mit den entsprechenden Daten aus einem
// eventuell vorhandenen Querystring ausfuellen

function auto_fill_form(form) {
    var autosubmit = 0
    var query = location.search
    if (query.indexOf("?") == 0) query = query.substring(1)
    if (!query.length) return 0
    var pairs = query.split("&")
    var catalogs=document.getElementsByName("kataloge");
    for(var i = 0; i < pairs.length; i++) {
	var pair = pairs[i].split("=");
	if (document.getElementsByName("input-charset").length
	    && document.getElementsByName("input-charset").item(0).value.indexOf("utf-8") >= 0) {
	    var key = decodeURI(pair[0]);
	    var val = decodeURI(pair[1]);
	} else {
	    var key = unescape(pair[0]);
	    var val = unescape(pair[1]);
	}

	if (key == "autosubmit") {
	    autosubmit = 1;
	} else if (key == "kataloge") {
	    for(var j=0; j<catalogs.length; j++) {
	       if( (catalogs[j].type=="checkbox")
	           && ((catalogs[j].value==val) || (val=="alle"))) {
	       
		    catalogs[j].checked=true;
		    if (!(val=="alle")) break;
	       }
	   }
	} else {
	    // Eingabefelder fÃ¼llen
	    $(':input[type=text]').each(function(index) {
		if (key == $(this).attr('name')) form.elements[key].value = val
	    });
	}
    }

    // autosubmit nur, wenn ein Katalog ausgewÃ¤hlt ist
    if (autosubmit)
      for(var j=0; j<catalogs.length; j++) {
        if (catalogs[j].checked==true) {
          form.submit();
          break;
        }
      }
    return 0
}

function doStatistics(logdataStr) {
    if (logdataStr != "") {
        logdataStr = "kvk myCatalogs " + logdataStr;
        $.get('/hylib/statistics.php', {logdata: logdataStr });
    }
}


