/** * JavaScript core * * @author Peter Dobetsberger * * Conventions: * Variables in camelCase * Classes in PascalCase * Function/Methods in camelCase */ // wechselt SPrachen S.changeLanguage = function(url){ location.href=url; } S.email = function(data){ var pattern = /^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$/; if(data.match(pattern)){ return true; }else{ return false; } } // Suchfeldeingabe leer setzen S.clearField = function (field,ignorestring) { if (document.getElementById(field).value==ignorestring) { document.getElementById(field).value=''; document.getElementById(field).focus(); } } /** * Fly-out navigation für den IE6 */ S.hoverNavi = function() { //if(navigator.userAgent.match("MSIE 6.0")) { $(".moduleMainNav ul li").mouseover( function() { $(this).find("ul").show(); }); $(".moduleMainNav ul li").mouseout( function() { $(this).find("ul").hide(); }); //} } S.createVcard = function(element){ var vCard = $(element); //Binding für Print u. VCF vCard.bind("click", function(){ vcf($(this)); return false; }); function vcf(elm){ var daten = $(elm).parent().parent().children("p"); var date = new Date(); var vcf = "BEGIN:VCARD"+"\n"+ "FN:"+daten.eq(1).text()+"\n"+ "ADR;POSTAL;WORK::"+daten.eq(0).text()+"\n"+ "LABEL;POSTAL;WORK;ENCODING=QUOTED-PRINTABLE:"+daten.eq(0)+"\n"+ "TEL;WORK;VOICE;MESG;PREF:"+daten.eq(3).text()+"\n"+ //TEL;WORK;FAX:+49-6081-911170 "EMAIL;Internet:"+daten.eq(4).text()+"\n"+ //URL:http://www.riedborn-apotheke.de //UID:http://www.riedborn-apotheke.de "TZ:"+date.getTimezoneOffset()+"\n"+ //"REV:"+date.getFullYear()+date.getMonth()+date.getDay()+"T"+date.getHours()+date.getMinutes()+date.getSeconds()+"\n"+ "VERSION:2.1"+"\n"+ "END:VCARD"; $.post("http://www.boewe-systec.com/___easyred/easyred_project/templates/inc_functions/function_vcard.php", { data : vcf } ,function(data){ document.location.href=data }); } } S.printContact = function(element){ var printer = $(element); //Binding für Print printer.bind("click", function(){ print($(this)); return false; }); function print(elm){ var content = elm.parent().parent().html(); var winURL = "about:blank"; var winName = elm.text(); var ref = window.open('about:blank', 'winName', 'width=400, height=400, resizeable=yes, scrollable=yes, location=yes, menubar=yes, status=yes, dependent=no, left=150,top=150'); $(window).ready(function(){ ref.document.title = winName; ref.document.url = document.location.href; //content += ''; ref.document.write(content); ref.document.close(); }); ref.print(); } } S.sendVcf = function(selector){ var $file = getLink(selector); /********/ start($file); /********/ function start(file){ $(selector).click(function(e){ var offset = $(selector).parent().parent().offset(); var Top = e.pageY-100; ; var Left = e.pageX; var parent = $("body").append(writeHtml(file)); setClose(parent.find(".jsClose")); parent.find(".gridLayer1").css({ top : Top+"px", left : Left-150+"px" }); parent.find(".jsContent").html(makeForm(file)); parent.find("form.jsVcfSend").submit(function(){ var vars = $(this).serializeArray(); if(S.email(vars[1].value)){ $.post($(this).attr("action"), vars, function(data){ if(data=='1'){ parent.find("form.jsVcfSend").html(js_contact_ok); }else{ parent.find("form.jsVcfSend").html(js_contact_failed); } setTimeout(function(){ parent.find(".jsClose").click(); },3500) }); }else{ $(this).prepend("
"+js_invalid_email+"
"); } return false; }) }); } function writeHtml(file){ var output = '
'+ '
'+ ''+js_close+''+ '
'+ '
'+ '
 
'+ '
'; return output; } function makeForm(file){ var id="email_"+ Math.round(Math.random(100) * 1000); var output = '
'+ ''+ '
'+ '
' '
'; return output; } function setClose(selector){ $(selector).click(function(){ $(this).parent().parent().remove(); }) } function getLink(selector){ return $(selector).attr("href"); } } S.boeweMap = function(listRoot, optionChild){ var liRoot = $(listRoot); var root = liRoot.parent().parent(); var aanchors = liRoot.children("a"); var abselects = liRoot.children(".boxSelect"); // var aoptions = $(optionChild+":enabled"); var doptions = $(optionChild+":disabled"); var vcf = $(".boxMail"); var selecttext = $(optionChild).eq(0).parent().siblings("span").text(); var adescriptions = liRoot.children(".boxDescription"); var woptions = []; var wdescriptions = []; var wanchors = []; var rootHeight = root.height(); $(optionChild+":disabled").attr("selected",true); //Baum hierarchisch durchsuchen und abspeichern for(var i = 0; i < liRoot.length; i++){ woptions[i]= liRoot.eq(i).children(".boxSelect").children("select").children("option:enabled"); wdescriptions[i]=liRoot.eq(i).children(".boxDescription"); wanchors[i]=liRoot.eq(i).children("a"); } //Bindings für a der LI for(var k = 0; k < wanchors.length ;k++){ wanchors[k].bind("click",{},function(e){ var sibl = $(this).siblings(".boxSelect"); aanchors.removeClass("active"); adescriptions.css("display","none"); root.css("height",rootHeight + "px"); sibl.children("span").text(selecttext); doptions.attr("selected", true); if(sibl.css("display") == "none"){ abselects.css("display","none"); sibl.css("display","block"); $(this).addClass("active"); }else{ aanchors.removeClass("active"); sibl.css("display","none"); } return false; }); } //Bindings für Options for(var j = 0; j < woptions.length; j++){ woptions[j].parent().bind("change",{ index : woptions[j], forindex : j },function(e){ //alert("test"); adescriptions.css("display","none"); var newheight = (rootHeight / 3 + (wdescriptions[e.data.forindex].eq(e.data.index.index($(this).children("option:selected"))).height())); wdescriptions[e.data.forindex].eq(e.data.index.index($(this).children("option:selected"))).css("display","block"); root.css("cssText","height: " + newheight + "px !important"); var wtext = $(this).children("option:selected").text(); $(this).parent().children("span").text(wtext); }) // woptions[j].bind("mouseover",function(e){ // var wtext = $(this).text(); // $(this).parent().parent().children("span").text(wtext); // }); } } /** * Erstellt einen Slider mit einer Timeline. Abstufung der Timeline erzeugt sich aus der Anzahl der option Felder * @param root: Rootelement durch css schreibweise * @param slider: Sliderelement * @param content: Content Container * @param cat: Element das den Inhalt der Beschriftung für die Timeline enthält * @param active: Bestimmt welches Element bei init aktiv sein soll / OPTIONAL sonst letztes */ S.sliderTime = function(root, slider, content, cat, active){ var sliderRoot = $(root); var sliderself = $(slider); var slidercontent = $(content); //var opt = getOptions(sliderself); var contentchildren = slidercontent.children("div"); var sWidth = getMetrics(sliderRoot); var start; if(typeof active== 'undefined'){ var start = contentchildren.length-1; }else{ var start = active - 1; } var timeLine = createTimeline(contentchildren, sliderRoot, start); var tWidth = createListStyle(sWidth, contentchildren.length, timeLine); var offset = timeLine.children("li.active").offset(); var offset2 = sliderRoot.offset(); var cordX = (offset.left + 13) - offset2.left; toggle(sWidth,cordX,contentchildren,timeLine, false); contentchildren.css("display","none"); contentchildren.eq(start).css("display","block"); //resetOption(opt); //Binding sliderself.bind("mousedown",function(e){ $("body").bind("mousemove",function(e){ var offset = sliderRoot.offset(); var cordX = e.pageX - offset.left - (parseInt(sliderRoot.children("div").css("marginLeft"))) - 8; if(parseInt(cordX) >= 13 && parseInt(cordX) < (sWidth)){ sliderself.css("left", cordX + "px"); } }); }).bind("mouseup",function(e){ var offset = sliderRoot.offset(); var cordX = e.pageX - offset.left - (parseInt(sliderRoot.children("div").css("marginLeft"))) - 8; toggle(sWidth,cordX,contentchildren,timeLine, true); $("body").unbind("mousemove"); }); timeLine.children("li").bind("click",function(e){ var offset = $(this).offset(); var offset2 = sliderRoot.offset(); var cordX = (offset.left + 13) - offset2.left; toggle(sWidth, cordX, contentchildren, timeLine, true); }); //Holt die Optionsfelder function getOptions(sib){ var opt = sib.siblings("select").children("option"); return opt; } //Erstellt den Zeitstrahl function createTimeline(con, root, active){ var status = ""; var output = "
    "; for(var i = 0; i < con.length; i++){ status = ""; if(active == i) status = " active"; if(i==0){ output += "
  1. "+con.eq(i).children(cat).text()+"
  2. "; }else{ if(i != 0 && i == con.length-1){ output += "
  3. "+con.eq(i).children(cat).text()+"
  4. "; }else{ output += "
  5. "+con.eq(i).children(cat).text()+"
  6. "; } } } root.prepend(output); return root.children("ol"); } //Erfasst die Abmessungen des Sliders function getMetrics(root){ var sWidth = root.children("div").width(); return sWidth; } //Erstellt den Style des Sliders function createListStyle(val1, val2, elm){ var twidth = val1 / val2; elm.children("li").css("width", twidth + "px"); return twidth; } //Wechselt den ausgewählten Optioneintrag/ Activestatus der Timeline function toggle(val1, val2, mult, list, anim){ var t= (val2+17) * mult.length; var e = Math.floor(t / val1); e = (e < mult.length) ? e : mult.length -1; e = (e > 0 && e < mult.length) ? e : 0 ; var offset = list.children("li").eq(e).offset(); var offset2 = sliderRoot.offset(); var cordX = (offset.left - 17) - offset2.left + tWidth / 2; if(list.children("li").eq(e).hasClass("active")){ if(anim){ sliderself.animate({ left : cordX + "px" }); }else{ sliderself.css({ left : cordX + "px" }); } }else{ list.children("li").removeClass("active"); list.children("li").eq(e).addClass("active"); mult.attr("selected",false); mult.eq(e).attr("selected",true); if(anim){ sliderself.animate({ left : cordX + "px" }); }else{ sliderself.css({ left : cordX + "px" }); } viewContent(e); } } //Reset der Options function resetOption(elm){ elm.eq(0).attr("selected",true); } //content ein/ausblenden function viewContent(num){ contentchildren.css("display","none"); contentchildren.eq(num).fadeIn(1000); } } /** * @Object * Template */ S.Template = { /** * Layer top-posotion-difference */ contentLayerTopDif: -151, /** * Layer status-constants */ contentLayerStatusOpen: 2, contentLayerStatusClosed: 1, contentLayerNotCreated: undefined, contentLayerStack: new Array(), /** * Creates an content-layer and saves it into the jsQuery-data object (opener) * and tranfers the html-content from an another element (contetn) * * @param {String} opener - Id name from the opener tag * @param {String} content - Id from the module-content (content-transfering) * @param {Number} topDif - Top-position difference * @returns {Boolean} */ switchContentLayer: function(opener, content, topDif) { var $opener = $(opener); var $layer, $container, $content; switch ($opener.data('layerStatus')) { // -------------------------------- // First click: Create new layer // -------------------------------- case this.contentLayerNotCreated: $container = $('.gridCenter'); $layer = this.createNewLayer(); $content = $(content); $layer.find('.jsContent').html($content.html()); var topDifPos = (topDif === undefined) ? this.contentLayerTopDif : this.contentLayerTopDif + topDif; $layer.css('top', parseInt($opener.offset().top + topDifPos)+'px'); $container.append($layer); $content.remove(); $layer.find('.jsClose').click(function(){ $layer.css('display', 'none'); $opener.data('layerStatus', S.Template.contentLayerStatusClosed); }); $opener.data('layer', $layer); $opener.data('layerStatus', this.contentLayerStatusOpen); this.contentLayerStack.push($opener); break; // -------------------------------- // Layer is closed: Open layer // -------------------------------- case this.contentLayerStatusClosed: $layer = $opener.data('layer'); $layer.css('display', 'block'); var topDifPos = (topDif === undefined) ? this.contentLayerTopDif : this.contentLayerTopDif + topDif; $layer.css('top', parseInt($opener.offset().top + topDifPos)+'px'); $opener.data('layerStatus', this.contentLayerStatusOpen); break; // -------------------------------- // Layer is open: Close layer // -------------------------------- case this.contentLayerStatusOpen: $layer = $opener.data('layer'); $layer.css('display', 'none'); $opener.data('layerStatus', this.contentLayerStatusClosed); break; } return false; }, /** * Creates an new html-element-node (layer) as an jQuery-object * * @returns {Object} - jQuery */ createNewLayer: function() { return $( '
    '+ '
    '+ ' Schließen'+ '
    '+ '
    '+ '
    '+ '
    ' ); } } /** * @class * Gallery */ S.Gallery = function(pInstanceName) { var instance = this; var instanceName; var $galleryNode = null; var $links = null; var $currentImage = null; var loadedImages = new Array(); var $imageCont = null; var $imageAnim = null; var $imageTitle = null; var currentIndex = 0; var animDuration = 500; // -------------------------------------------------------- // Constructor -------------------------------------------- // -------------------------------------------------------- /** * Conscrutor * * @param {String} pInstanceName ~ Instance-Name */ function __construct(pInstanceName) { S.strict([String], arguments); instanceName = pInstanceName; $galleryNode = $(pInstanceName); $links = $galleryNode.find("li"); _loadImages(); _createImageContainer(); _createOnClickEvent(); } // -------------------------------------------------------- // Public ------------------------------------------------- // -------------------------------------------------------- /** * Shows the selected images by calling the private members * * @param {Integer} index * @param {Boolean} animation ~ with or without animation * @returns {object} ~ instance */ this.show = function(index, animation) { S.strict([Number], [index]); index--; currentIndex = index; $currentImage = $galleryNode.find('li img:eq('+index+')'); if (animation !== undefined && animation === true) { _anim(); } _show(index); return instance; } /** * Set duration from animation * * @param {Integer} seconds ~ time in Seconds * @returns {object} ~ instance */ this.duration = function(seconds) { S.strict([Number], [seconds]); animDuration = seconds*1000; return instance; } // -------------------------------------------------------- // Private ------------------------------------------------ // -------------------------------------------------------- /** * Show image * * @param {Integer} index */ function _show(index) { //$imageCont.attr('src', $currentImage.attr('alt')); $imageCont.attr('src', loadedImages[index].src); $imageTitle.text($currentImage.attr('title')); $links.removeClass('active'); $links.eq(index).addClass('active'); _setVerticalImageClass(); currentIndex = index; } /** * Animate * */ function _anim() { $imageAnim.attr('src', $imageCont.attr('src')); $imageAnim.css({ display: 'block', opacity: 1 }); $imageAnim.animate({ opacity: 0 }, animDuration, function() { $imageAnim.css('display', 'none'); }); } /** * Creating the click-events * */ function _createOnClickEvent() { var $imgLinks = $links.find("img"); $imgLinks.each(function(){ var index = $imgLinks.index(this); index++; $(this).focus(function(){ this.blur(); }); $(this).click(function(){ return window.S.Data.get(instanceName).show(index, true); }); }); } /** * Creating the zoom-image container * */ function _createImageContainer() { $('
    ' + ' ' + ' ' + '

    ' + '
    ' ).prependTo($galleryNode); $imageCont = $galleryNode.find('.jsImage'); $imageAnim = $galleryNode.find('.jsAnimation'); $imageAnim.attr('src', loadedImages[currentIndex].src); $imageAnim.css('left', 0); $imageTitle = $galleryNode.find('.jsTitle'); } /** * Loads all images from server * */ function _loadImages() { var $images = $links.find("span"); var image; for (var i=0; i<$images.size(); i++) { image = new Image(); image.src = $images.eq(i).text(); loadedImages.push(image); } } /** * Loads all images from server * */ function _setVerticalImageClass() { var $images = $links.find("img"); for (var i=0; i<$images.size(); i++) { var isHoriz = ($images.get(i).offsetWidth < $images.get(i).offsetHeight) ? true : false; if (isHoriz) { $links.eq(i).addClass('boxFormat'); } } } // Init class window.S.Data.set(pInstanceName, instance); __construct(pInstanceName); } /** * @class Handles visibility of nes items on the news index page according to their type an year **/ S.NewsSelect = function(newsElemSelector, selectElemSelector,typeTextMapping,emptyTextSelector,zebra) { var self = this; var allText = typeTextMapping[0]; var allValue = "0"; var showAllOnLoad = false; if(typeof(zebra) === "undefined" || zebra === null){ zebra = false; } var YEAR = 1; var TYPE = 2; var selectedType = ""; var selectedYear = ""; var $emptyText = $(emptyTextSelector); var $newsElems = $(newsElemSelector); var $selets = $(selectElemSelector); var $typeSelect = $selets.eq(0); var $yearSelect = $selets.eq(1); this.init = function(all){ if(typeof(all) === "undefined" || all === null){ all = false; } showAllOnLoad = all; var types = getData($newsElems, TYPE); var years = getData($newsElems, YEAR); if(showAllOnLoad != all){ selectedType=types[0]; selectedYear=years[0]; }else{ selectedType="0"; selectedYear="0"; } var optionsType = getOptions(types, TYPE); var optionsYear = getOptions(years, YEAR); $typeSelect.html(optionsType); $yearSelect.html(optionsYear); $typeSelect.change(function(){ select(selectedYear, $(this).val()); }); $yearSelect.change(function(){ select($(this).val(), selectedType); }); $(selectElemSelector).show(); select(selectedYear, selectedType); } var getOptions = function(values, op){ var ret =""; if(showAllOnLoad){ ret += ""; } for(var i =0; i'+year+''; } var buildOptionType = function(type){ return ''; } /** * Selects year */ var select = function(year, type) { var elemYear, elemType, $e; var counter =0; var visible = false; $emptyText.hide(); selectedYear =year; selectedType =type; $newsElems.each( function(index, elem) { $e = $(elem); elemType = getType(elem); elemYear = getYear(elem); if((year === elemYear || year === allValue) && (type===elemType || type===allValue)){ $e.show(); counter++; visible = true; }else{ $e.hide(); visible = false; } if(zebra !== false && visible) { if(counter%2 === 1){ $e.addClass(zebra.oddClass); } else{ $e.addClass(zebra.evenClass); } } }); if(counter ===0){ $emptyText.show(); } } var getData = function($elems, op){ var ret=[]; $elems.each(function(i,e){ var val = ""; if(op===TYPE){ val = getType(e); } else if(op===YEAR){ val = getYear(e); } if($.inArray(val, ret) === -1){ ret.push(val); } }); return ret; } var getType = function(elem){ var split = elem.id.split("_"); return split[split.length-1]; } var getYear = function(elem){ var split = elem.id.split("_"); var dateSplit = split[1].split("-"); return dateSplit[0]; } }; /** * Class used for Zebra */ S.Zebra = function(evenClassName, oddClassName) { this.evenClass = evenClassName; this.oddClass = oddClassName; } /** * @param gallery, css class der Gallery */ S.imageGallery = function(gallery, duration) { //init var _$gallery = $(gallery); var time; if(duration){ var _$duration = duration; }else{ var _$duration = 3500; } //Anzahl Bilder => Anzahl Beschreibungen var _$images = _$gallery.children("img"); var imageAnzahl = _$images.length; //Pfade speichern var imgPath = []; for(var i = 0; i < imageAnzahl; i++){ imgPath.push(_$images.eq(i).attr("src")); } var time; reset_gallery(); function reset_gallery(){ for(var i = 0; i < imageAnzahl; i++){ if(i == 0 || i == 1){ _$images.eq(i).css("position","absolute").css("zIndex",2-i); }else{ _$images.eq(i).css("position","absolute").hide(); } } } /** * @param index, position des Bildes/Beschreibung die aktiv werden soll * @param that, aktuelles Element (parent) */ this.toggle_image = function(index, that){ toggle_image(index, that); } function toggle_image(index, that){ //img tauschen if(!that.children("li").eq(index).hasClass("active")){ _$images.eq(0).stop(true, true); _$images.eq(1).attr("src", imgPath[index]); _$images.eq(0).fadeOut(500,function(){ $(this).attr("src", imgPath[index]); }).fadeIn(500); //marker setzen that.children("li").removeClass("active"); that.children("li").eq(index).addClass("active"); } } this.generate_controller = function(){ if(imageAnzahl > 1){ var id = "img_" + Math.round((Math.random() * 1000)); var html = "
      "; for(var j = 0; j < imageAnzahl; j++){ if(j == 0){ html += "
    • "+(j+1)+"
    • "; }else{ html += "
    • "+(j+1)+"
    • "; } } html += "
    "; _$gallery.append(html); //append mouseover var _$buttons = $("#"+id).children("li"); for(var k = 0; k < imageAnzahl; k++){ _$buttons.eq(k).bind('mouseover',{ pos : k },function(event){ toggle_image(event.data.pos, $(this).parent()); clearTimeout(time); start_gallery(); }); } } } function start_gallery(){ time = setTimeout(function(){ var lis = _$gallery.children("ul").children("li"); var lisA = _$gallery.children("ul").children("li.active"); var index = lis.index(lisA); if(index == lis.length - 1){ toggle_image(0, _$gallery.children("ul")); }else{ toggle_image(index+1, _$gallery.children("ul")); } clearTimeout(time); start_gallery(); }, _$duration); } this.start_gallery = function(){ if(imageAnzahl > 1){ start_gallery(); // _$gallery.bind("mouseover", function(){ // clearTimeout(time); // }).bind("mouseout", function(){ // start_gallery(); // }); } } } S.replaceSelect = function(selectorSelect){ var $select = $(selectorSelect); $(document).ready(function(){ $select.each(function(index){ var select = $(this); var tmp = select.parent(); var pos = select.offset(); var parPos = tmp.offset(); var left = pos.left - parPos.left; select.after('
     
    '); var div = tmp.find(".jsSelect"); if(div.length > 1){ div = div.eq(index); }else{ // } if(select.css("position") != "absolute"){ select.css( { opacity : 0, filter:"alpha(opacity=0)", position : "relative", zIndex : 1 }); }else{ select.css( { opacity : 0, filter:"alpha(opacity=0)", zIndex : 1 }); } var selected = select.find("option:selected"); if(selected.length == 0){ div.text(select.find("option").eq(0).text()); }else{ div.text(selected.eq(0).text()); } tmp.css({ position : "relative" }); var top = parseInt(pos.top) - parseInt(parPos.top); //Berechnungen; var bgPos = 0; if(parseInt(select.css("width")) < 200){ bgPos = -100; } if(parseInt(select.css("width")) < 140){ bgPos = 0; } if(parseInt(select.css("width")) > 200){ bgPos = -200; } var width = parseInt(select.width()); div.css({ position : "absolute", top : top + "px" , //left : left+"px", //right : select.css("right"), bottom : select.css("bottom"), width : width+"px", backgroundPosition : "0px "+bgPos+"px", zIndex : 0 }); var calcOffset = parseInt(tmp.css("width")) - (left + parseInt(div.outerWidth())); if(calcOffset < 0) left += calcOffset; div.css({ left : left+"px" }); select.bind("change", function(){ div.text(select.find("option:selected").text()); }); }); }); }