Guest User

Forme

a guest
Oct 22nd, 2014
604
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /// <reference path="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"/>
  2.  
  3. var Chayns = {};
  4.  
  5. (function () {
  6.  
  7.    //#region vars
  8.  
  9.    var that = this;
  10.  
  11.    var cacheVersion = "100" + 6,
  12.       cssVersion = "V2_100",
  13.       invertVersion = "V2_100",
  14.       webshadowCssVersion = "V2_100",
  15.       chaynsApiRoot = "//" + window.location.host + "/SlitteRessource/API/",
  16.       loadedInWebshadow = false,
  17.       lastSetHeightOffset = 0,
  18.       setHeightInterval = null,
  19.       lastWindowWidth = window.innerWidth,
  20.       lastWindowHeight = window.innerHeight,
  21.       uacGroups = null,
  22.       locationUsers = null,
  23.       isAdminList = {},
  24.       getAppInfosUserCallBacks = [],
  25.       singelGeoCoordinatesResponse,
  26.       getLongLatCallBack,
  27.       bleResponseCallback,
  28.       createQRCodeCallBack,
  29.       beaconListCallBack,
  30.       appInfos = null,
  31.       beaconList = null,
  32.       dateSelectCallBackOptions = null,
  33.       languages = { 1: "german", 2: "english", 5: "dutch" },
  34.       chaynsCSSRules = [],
  35.       fbFriendsAccessToken = "",
  36.       facebookFriends = null,
  37.       foldOutTableTypes = { FoldOutTableNormal: "FoldOutTableNormal", FoldOutTableWrappedEntries: "FoldOutTableWrappedEntries" },
  38.       facebookFriendsResultCallback = null,
  39.       chaynsCallQueue = [];
  40.  
  41.    this.Slitte = {};
  42.    this.App = this.Slitte;
  43.    this.API = {};
  44.  
  45.    this.UrlParameter = {};
  46.    this.OS = "";
  47.    this.DeviceOS = "";
  48.    this.OSVersion = "";
  49.    this.AppVersion = "";
  50.    this.SiteID = "";
  51.    this.IsColorInverted = false;
  52.    this.Language = null;
  53.    this.Colors = null;
  54.  
  55.    this.CaptionButtonCallback = function () { };
  56.    this.BackButtonCallback = function () { };
  57.    this.GetLngLatCallBack = handleLongLatCallBack;
  58.    this.NfcCallBack = function () { };
  59.    this.FBChangedCallBack = function () { };
  60.    this.DateSelectCallBack = handleDateSelectResponse;
  61.    this.GetAppInfosCallBack = handleNewAppInfos;
  62.    this.ImageUploadCallBack = null;
  63.    this.BLECallBack = handleBLEResponse;
  64.    this.ScanQRCodeCallBack = function () { };
  65.    this.CreateQRCodeCallBack = handleCreateQRCodeResponse;
  66.    this.GetBeaconsCallBack = handleNewBeaconsResponse;
  67.  
  68.    //#endregion
  69.  
  70.    //#region Init
  71.    if (isLangResLoaded()) {
  72.       this.DayNames = [];
  73.       var dayNamesArray = LangRes.Get('txt_default_days_array').split(",");
  74.       if (dayNamesArray.length > 0) {
  75.          for (var i = 7; i < dayNamesArray.length; i++)
  76.             this.DayNames.push(dayNamesArray[i]);
  77.       }
  78.  
  79.       this.MonthNames = [];
  80.       var monthNamesArray = LangRes.Get('txt_default_months_array').split(",");
  81.       if (monthNamesArray.length > 0) {
  82.          for (var i = 12; i < monthNamesArray.length; i++)
  83.             this.MonthNames.push(monthNamesArray[i]);
  84.       }
  85.    } else {
  86.       this.DayNames = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"];
  87.       this.MonthNames = ["Januar", "Februar", "M" + String.fromCharCode(228) + "rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
  88.    }
  89.  
  90.    getparams();
  91.    createHeadTags();
  92.    preLoadImg();
  93.    listenPostMessage();
  94.  
  95.    if (!window.console) window.console = {};
  96.    if (typeof window.console.log != 'function') window.console.log = function () { };
  97.  
  98.    if (isJQload()) {
  99.       $.support.cors = true;
  100.       jQuery.support.cors = true;
  101.       $(document).ready(function () {
  102.          setupChaynsCallQueue();
  103.  
  104.          $("body").append('<div id="ChaynsRoot"></div>');
  105.  
  106.          var rootContainer = ["ChaynsSelectContainer", "ChaynsPopUpContainer"];
  107.          for (var container = 0; container < rootContainer.length; container++) {
  108.             $("#ChaynsRoot").append('<div class="' + rootContainer[container] + '"></div>');
  109.          }
  110.          onLoadDocument();
  111.          var showBody = function () { $('body').css('visibility', 'visible'); };
  112.          if (!that.Slitte.GetAppInfos(showBody)) {
  113.             createColorSchemeCSS();
  114.             showBody();
  115.          }
  116.          setTimeout(showBody, 200);
  117.       });
  118.    }
  119.  
  120.    //#endregion
  121.  
  122.    //#region Layout
  123.  
  124.    this.Ready = function (CallBack) {
  125.       if (typeof CallBack == 'function') {
  126.          if (isJQload()) {
  127.             if (appInfos == null) {//noch nicht aufgerufen (auf DOM-ready warten)
  128.                getAppInfosUserCallBacks.push(CallBack);
  129.             } else if (!this.Slitte.GetAppInfos(CallBack)) {//immer zurück geben
  130.                CallBack(null);
  131.             }
  132.          } else {
  133.             CallBack(null);
  134.          }
  135.       }
  136.    }
  137.  
  138.    this.SetIntroText = function (Content) {
  139.       if (isJQload()) {
  140.          if (Content) {
  141.             var introBox = $("#IntroBox");
  142.             if (introBox.length > 0) {
  143.                introBox.html(Content);
  144.             } else {
  145.                var modeSwitchBox = $('#ModeSwitch'),
  146.                   introBoxHTML = '<div id="IntroBox">' + Content + '</div>';
  147.                if (modeSwitchBox.length > 0) {
  148.                   $(introBoxHTML).insertAfter(modeSwitchBox);
  149.                } else {
  150.                   $("body").prepend(introBoxHTML);
  151.                }
  152.             }
  153.             return $("#IntroBox");
  154.          } else {
  155.             that.RemoveIntroText();
  156.          }
  157.       }
  158.    }
  159.  
  160.    this.RemoveIntroText = function () {
  161.       if (isJQload()) {
  162.          $("#IntroBox").remove();
  163.       }
  164.    }
  165.  
  166.    this.CreateBox = function (ParentElement, Content, BoxID, Admin) {
  167.       if (isJQload()) {
  168.          var boxwrapper = createDomElement("div", { "class": "BoxWrapper" + (Admin ? " AdminBox" : "") });
  169.          if (BoxID) boxwrapper.id = BoxID;
  170.          var contentwrapper = createDomElement("div", { "class": "ContentWrapper" }, Content);
  171.          boxwrapper.appendChild(contentwrapper);
  172.          if (ParentElement) {
  173.             if (typeof ParentElement == "string") {//ID
  174.                var elm = document.getElementById(ParentElement);
  175.                if (elm) {
  176.                   elm.appendChild(boxwrapper);
  177.                   return;
  178.                }
  179.             } else if (ParentElement.appendChild) {//DomElement
  180.                ParentElement.appendChild(boxwrapper);
  181.                return;
  182.             } else if (ParentElement.append && ParentElement.length > 0) {//jQuery
  183.                ParentElement.append(boxwrapper);
  184.                return;
  185.             }
  186.          }
  187.          return $(boxwrapper);
  188.       }
  189.    }
  190.  
  191.    this.WrapBox = function (Element, BoxID, Admin) {
  192.       var box = that.CreateBox(null, null, BoxID, Admin);
  193.       if (isJQload()) {
  194.          if (typeof Element == "string" && Element.indexOf("#") == -1)
  195.             Element = "#" + Element;
  196.          return $(Element).wrap(box).closest(".BoxWrapper");
  197.       }
  198.    }
  199.  
  200.    this.AnimateHeight = function (obj, height, isCompleteHeight) {
  201.       $(obj).css("height", $(obj).innerHeight() + "px");
  202.       window.setTimeout(function () {
  203.          $(obj).addClass("Animate");
  204.          $(obj).css("height", height);
  205.          window.setTimeout(function () {
  206.             $(obj).removeClass("Animate");
  207.             if (isCompleteHeight != undefined && isCompleteHeight && obj.css("height") == height) {
  208.                $(obj).css("height", "auto");
  209.             }
  210.          }, 600);
  211.       }, 20);
  212.    }
  213.  
  214.    function onLoadDocument() {
  215.       if (that.OS == "IOS") {
  216.          document.body.style.fontSize = "14px";
  217.          document.body.style.lineHeight = "23px";
  218.       } else if (that.OS.indexOf("WEBSHADOW") != -1) {
  219.          document.body.style.fontSize = "14px";
  220.          document.body.style.lineHeight = "23px";
  221.       } else if (that.OS == "WP8") {
  222.          document.body.style.fontSize = "14px";
  223.          document.body.style.lineHeight = "23px";
  224.       } else {
  225.          document.body.style.fontSize = "16px";
  226.          document.body.style.lineHeight = "21px";
  227.       }
  228.  
  229.       if (that.OS.indexOf("WEBSHADOW") == 0) {
  230.          that.SetWebshadowHeight();
  231.       }
  232.  
  233.       if (isJQload()) {
  234.          $("body").attr("ontouchstart", " ");
  235.       }
  236.    }
  237.  
  238.    this.CreateSwitch = function (Parent, TrueText, FalseText, State, CallBack) {
  239.       if (isJQload() && TrueText && FalseText && TrueText) {
  240.          State = State ? true : false;
  241.          var wrapper = createDomElement("div", { "class": "switch", state: State.toString() });
  242.          var trueElm = createDomElement("div", { "class": State ? "" : "inActive" }, TrueText);
  243.          var falseElm = createDomElement("div", { "class": State ? "inActive" : "" }, FalseText);
  244.          wrapper.appendChild(trueElm);
  245.          wrapper.appendChild(falseElm);
  246.          wrapper.onclick = function () {
  247.             var elm = $(this);
  248.             elm.find("div").toggleClass("inActive")
  249.             elm.attr("state", elm.attr("state") == "true" ? "false" : "true");
  250.  
  251.             if (typeof CallBack == "function")
  252.                CallBack.apply(this, [elm.attr("state") == "true"]);
  253.          };
  254.          if (Parent) {
  255.             if (typeof Parent == "string" && Parent.indexOf("#") == -1)
  256.                Parent = "#" + Parent;
  257.             $(Parent).append(wrapper);
  258.          }
  259.          return $(wrapper);
  260.       }
  261.    }
  262.  
  263.    this.CreateCheckBox = function (Parent, Text, State, CallBack) {
  264.       if (isJQload() && Parent) {
  265.          Text = Text ? Text : "&nbsp;";
  266.          var cb = createDomElement("div", { "class": "checkBox" + (State ? " active" : "") }, Text);
  267.          cb.onclick = function () {
  268.             var elm = $(this);
  269.             elm.toggleClass("active");
  270.  
  271.             if (typeof CallBack == "function")
  272.                CallBack.apply(this, [elm.is(".active")]);
  273.          }
  274.          if (Parent) {
  275.             if (typeof Parent == "string" && Parent.indexOf("#") == -1)
  276.                Parent = "#" + Parent;
  277.             $(Parent).append(cb);
  278.          }
  279.          return $(cb);
  280.       }
  281.    }
  282.  
  283.    this.CreateCSSRule = function (selector, rules) {
  284.       if (typeof selector === "string" && typeof rules === "string") {//TODO: mit gleichem selector überschreiben
  285.          for (var i = 0; i < chaynsCSSRules.length; i++) {
  286.             if (selector == chaynsCSSRules[i].selector) {
  287.                chaynsCSSRules[i].rules = rules;
  288.                writeChaynsCSS();
  289.                return true;
  290.             }
  291.          }
  292.          chaynsCSSRules.push({ selector: selector, rules: rules });
  293.          writeChaynsCSS();
  294.          return true;
  295.       }
  296.       return false;
  297.    }
  298.  
  299.    //#endregion
  300.  
  301.    //#region Select
  302.  
  303.    this.Select = function (Items, Multiple, CallBack, Headline, OnLoad) {
  304.       if (isJQload() && CallBack) {
  305.          if (Items && Items.length > 0) {
  306.             var defaultIndex = 0;
  307.             for (var i = 0; i < Items.length; i++) {
  308.                if (!(Items[i] instanceof that.SelectOption))
  309.                   return false;
  310.                else if (Items[i].Selected)
  311.                   defaultIndex = i;
  312.             }
  313.  
  314.             var list = '<div id="ChaynsAPISelectionContainer">';
  315.             for (var i = 0; i < Items.length; i++) {
  316.                var selected = Items[i].Selected ? " selected" : "";
  317.                list += '<div val="' + i + '" class="ChaynsAPISelectEntry' + selected + '">' + Items[i].Name + '</div>';
  318.             }
  319.             list += '</div>';
  320.          }
  321.  
  322.          var buttons = [
  323.              new that.PopUpButton(getLang('$txt_default_Cancel', "Abbrechen"), function () {
  324.                 if (typeof CallBack == "function")
  325.                    CallBack(null);
  326.              })
  327.          ];
  328.          if (Multiple)
  329.             buttons.push(new that.PopUpButton("OK", function () { selectDlgClosed(Items, CallBack); }));
  330.  
  331.          that.ShowPopUp(list, Headline, buttons, true, function (content) {
  332.             var itemHeight = $("#ChaynsAPISelectionContainer>.ChaynsAPISelectEntry").first().height() + 16;
  333.             var scrollHeight = (defaultIndex * itemHeight) - (content.height() / 2) + (itemHeight / 2);
  334.             content.scrollTop(scrollHeight);
  335.  
  336.             $("#ChaynsAPISelectionContainer>.ChaynsAPISelectEntry").on("click", function () {
  337.                selectDlgItemClicked(this, Items, CallBack, Multiple);
  338.             });
  339.             if (typeof OnLoad == "function") {
  340.                OnLoad(content);
  341.             }
  342.          });
  343.       }
  344.    }
  345.  
  346.    function selectChange(elm, list, cb) {
  347.       var index = $(elm).val();
  348.       $(elm).remove();
  349.       if (index == -1 || index == null) {//Bitte Wählen || none on mulitple
  350.          cb(null);
  351.       } else {
  352.          if (typeof index == "string") {
  353.             cb(list[index].Value);
  354.          } else {
  355.             var retval = [];
  356.             for (var i = 0; i < index.length; i++) {
  357.                if (index[i] != -1) {
  358.                   retval.push(list[index[i]].Value);
  359.                }
  360.             }
  361.             if (retval.length == 1)
  362.                cb(retval[0]);
  363.             else
  364.                cb(retval);
  365.          }
  366.       }
  367.    }
  368.  
  369.    function selectDlgClosed(Items, CallBack) {
  370.       if (typeof CallBack == "function") {
  371.          var list = [], textList = [];
  372.          var selected = $("#ChaynsAPISelectionContainer>.ChaynsAPISelectEntry.selected").each(function () {
  373.             list.push(Items[$(this).attr("val")].Value);
  374.             textList.push(Items[$(this).attr("val")].Name);
  375.          });
  376.          if (list.length == 1) {
  377.             CallBack(list[0], textList[0]);
  378.          } else if (list.length > 1) {
  379.             CallBack(list, textList);
  380.          } else {
  381.             CallBack(null);
  382.          }
  383.       }
  384.    }
  385.  
  386.    function selectDlgItemClicked(Element, Items, CallBack, Multiple) {
  387.       if (Multiple) {
  388.          $(Element).toggleClass("selected");
  389.       } else {
  390.          $(Element).addClass("selected").siblings(".selected").removeClass("selected");
  391.          closePopUp();
  392.          selectDlgClosed(Items, CallBack);
  393.       }
  394.    }
  395.  
  396.    //#endregion
  397.  
  398.    //#region FoldOutTableBasic
  399.  
  400.    function FoldOutTableBasic(Headline, Multiple, FoldOutTableType) {
  401.       //if (this.constructor != Chayns.FoldOutTable) {
  402.       //    //wird das Object nicht mit new instanziert, sondern wie eine Funktion aufgerufen, so wird eine neue FoldOutTable zurückgegeben.
  403.       //    return new Chayns.FoldOutTable(Headline, Multiple);
  404.       //}
  405.  
  406.       //--Private Fields
  407.       var me = this;
  408.       var headline = (Headline == undefined ? "" : Headline);
  409.       var items = new Array();
  410.       var multiple = (!Multiple ? false : true);
  411.       var element;
  412.       var type = FoldOutTableType == undefined ? foldOutTableTypes.FoldOutTableNormal : FoldOutTableType;
  413.  
  414.       //--Public Methods
  415.       this.Print = type == foldOutTableTypes.FoldOutTableWrappedEntries ? printFoldOutTableWrappedEntries : printFoldOutTable;
  416.       this.Helper = {
  417.          GetHeadline: function () {
  418.             return headline;
  419.          },
  420.          SetHeadline: function (newHeadline) {
  421.             if (newHeadline == null) {
  422.                newHeadline = "";
  423.             }
  424.             $(element).children(".FoldOutTableMainHeadline").html(newHeadline);
  425.             if (newHeadline == "" && headline.length > 0) {
  426.                $(element).children(".FoldOutTableMainHeadline").hide();
  427.             }
  428.             else if (newHeadline.length > 0 && headline == "") {
  429.                $(element).children(".FoldOutTableMainHeadline").show();
  430.             }
  431.             headline = newHeadline;
  432.          },
  433.          GetItems: function () {
  434.             return items;
  435.          },
  436.          GetElement: function () {
  437.             return element;
  438.          },
  439.          GetMultiple: function () {
  440.             return multiple;
  441.          },
  442.          SetMultiple: function (newMultiple) {
  443.             multiple = newMultiple;
  444.          },
  445.          GetType: function () {
  446.             return type;
  447.          }
  448.       };
  449.  
  450.       //--Public Fields
  451.       this.Items;
  452.       this.Multiple;
  453.       this.Headline;
  454.       this.Element;
  455.       this.Type;
  456.  
  457.       this.Items.push = function (ItemHeadline, ItemDescription, ItemSelected, ItemInActive, Position) {
  458.          var item = new FoldOutTableEntry(me, ItemHeadline, ItemDescription, ItemSelected, ItemInActive, Position);
  459.          if (Position < 0) {
  460.             return;
  461.          }
  462.          if (Position == null || Position >= items.length) {
  463.             items[items.length] = item;
  464.          } else if (Position == 0) {
  465.             items.unshift(item);
  466.          } else {
  467.             before = item;
  468.             for (var i = 0; i < items.length; i++) {
  469.                if (i >= Position) {
  470.                   var now = items[i];
  471.                   items[i] = before;
  472.                   before = now;
  473.                }
  474.             }
  475.             items[items.length] = before;
  476.          }
  477.          return items.length;
  478.       }
  479.  
  480.       this.Items.pop = function (item) {
  481.          items[items.length - 1].Remove(true);
  482.          items[items.length - 1] = undefined;
  483.          return Array.prototype.pop.apply(items);
  484.       }
  485.  
  486.       this.Items.shift = function () {
  487.          if (items[0]) {
  488.             items[0].Remove(true);
  489.             items[0] = undefined;
  490.             return Array.prototype.shift.apply(items);
  491.          }
  492.          return;
  493.       }
  494.  
  495.       this.Items.splice = function (StartIndex, Count) {
  496.          if (typeof StartIndex == "number" && typeof Count == "number") {
  497.             for (i = 0; i < Count; i++) {
  498.                items[StartIndex + i].Remove(true);
  499.                items[StartIndex + i] = undefined;
  500.             }
  501.          }
  502.          return Array.prototype.splice.apply(items, [StartIndex, Count]);
  503.       }
  504.  
  505.       element = buildFoldOutTable(me);
  506.    }
  507.  
  508.    Object.defineProperties(FoldOutTableBasic.prototype, {
  509.       "Headline": {
  510.          get: function () { return this.Helper.GetHeadline(); },
  511.          set: function (e) { this.Helper.SetHeadline(e); }
  512.       },
  513.       "Items": {
  514.          get: function () { return this.Helper.GetItems(); }
  515.       },
  516.       "Element": {
  517.          get: function () { return this.Helper.GetElement(); }
  518.       },
  519.       "Multiple": {
  520.          get: function () { return this.Helper.GetMultiple(); },
  521.          set: function (e) { this.Helper.SetMultiple(e); }
  522.       },
  523.       "Type": {
  524.          get: function () { return this.Helper.GetType(); }
  525.       }
  526.    });
  527.  
  528.    function printFoldOutTable(Container, WrapContent, AsAdminBox) {
  529.       try {
  530.          var rootFoldOutTable = null;
  531.          if (Container == undefined) { Container = document.body; WrapContent = true; }
  532.          $(Container).append(this.Element);
  533.          if (WrapContent != undefined && WrapContent) {
  534.             Chayns.WrapBox(this.Element, null, AsAdminBox);
  535.          }
  536.          if ($(this.Element).parent().hasClass("ContentWrapper")) {
  537.             $(this.Element).parent().css("padding", "0");
  538.          } else if ($(this.Element).closest('.FoldOutTableRowDescription').length > 0) {
  539.             $(this.Element).closest('.FoldOutTableRowDescription').css('padding', '0');
  540.          }
  541.       } catch (e) {
  542.          return null;
  543.       }
  544.    }
  545.  
  546.    function printFoldOutTableWrappedEntries(Container) {
  547.       try {
  548.          Container = Container ? Container : document.body;
  549.          $(Container).append(this.Element);
  550.       }
  551.       catch (e) {
  552.          return null;
  553.       }
  554.    }
  555.  
  556.    function buildFoldOutTable(obj) {
  557.       try {
  558.          var itemsCorrect = true;
  559.          for (var i = 0; i < obj.Items.length; i++) {
  560.             if (!(obj.Items[i] instanceof that.FoldOutTableEntry)) {
  561.                itemsCorrect = false;
  562.             }
  563.          }
  564.          if (!isJQload() || !itemsCorrect) {
  565.             return null;
  566.          }
  567.          if (obj.Multiple == undefined) obj.Multiple = false;
  568.          var html = $('<div class="ChaynsAPIFoldOutTableContainer"></div>');
  569.          var head = $('<div class="FoldOutTableRow FoldOutTableMainHeadline">' + obj.Headline + '</div>')
  570.          if (obj.Headline == "") {
  571.             head.hide();
  572.          }
  573.          html.append(head);
  574.  
  575.          return html;
  576.       }
  577.       catch (e) {
  578.          return null;
  579.       }
  580.    }
  581.  
  582.    function buildFoldOutTableEntry(item, parent) {
  583.       if (item.Selected && !parent.Multiple) {
  584.          for (var i = 0; i < parent.Items.length; i++) {
  585.             if (parent.Items[i].Selected && parent.Items[i] != item) {
  586.                item.Selected = false;
  587.                break;
  588.             }
  589.          }
  590.       }
  591.       var row = $('<div class="FoldOutTableRow"></div>');
  592.       var rowHeadline = $('<div class="FoldOutTableRowHeadline Animate' + (item.Selected ? ' Active' : '') + (item.InActive ? ' InActive' : '') + '">' + item.Headline + '</div>');
  593.       rowHeadline.on("click", null, item, FoldOutTableItemClicked);
  594.       row.append(rowHeadline);
  595.       var rowDescriptionContainer = $('<div class="FoldOutTableRowDescriptionContainer" ' + (item.Selected ? 'style="height:auto;"' : '') + '></div>');
  596.       if (typeof item.Description == "string") {
  597.          var rowDescription = $('<div class="FoldOutTableRowDescription">' + item.Description + '</div>');
  598.       } else {
  599.          var rowDescription = $('<div class="FoldOutTableRowDescription"></div>');
  600.          rowDescription.append(item.Description);
  601.       }
  602.       rowDescriptionContainer.append(rowDescription);
  603.       row.append(rowDescriptionContainer);
  604.       if (parent.Type == foldOutTableTypes.FoldOutTableWrappedEntries) {
  605.          row.addClass("WrappedEntries");
  606.          $(row.find(".FoldOutTableRowDescription")[0]).addClass("WrappedEntries");
  607.          $(row.find(".FoldOutTableRowHeadline")[0]).addClass("WrappedEntries");
  608.          Chayns.WrapBox(row);
  609.          row = row.parent().parent();
  610.          $(row.find(".ContentWrapper")[0]).css("padding", "0").parent().css('background-color', 'inherit');
  611.       }
  612.       return row;
  613.    }
  614.  
  615.    function FoldOutTableItemClicked(event) {
  616.       event.data.Selected = (!event.data.Selected);
  617.    }
  618.    //#endregion FoldOutTableBasic
  619.  
  620.    //#region FoldOutTable
  621.    this.FoldOutTable = function (Headline, Multiple) {
  622.       return new FoldOutTableBasic(Headline, Multiple, foldOutTableTypes.FoldOutTableNormal);
  623.    }
  624.    //#endregion FoldOutTable
  625.  
  626.    //#region FoldOutTableWrappedEntries
  627.    this.FoldOutTableWrappedEntries = function (Multiple) {
  628.       return new FoldOutTableBasic(null, Multiple, foldOutTableTypes.FoldOutTableWrappedEntries);
  629.    }
  630.    //#endregion FoldOutTableWrappedEntries
  631.  
  632.    //#region FBFriendsDlg
  633.  
  634.    this.ShowFacebookFriendsDlg = function (AccessToken, ForceUpdate, ResultCallback, OnLoadCallback, DisplayMe) {
  635.       DisplayMe = DisplayMe == undefined ? false : DisplayMe;
  636.       fbFriendsAccessToken = AccessToken || fbFriendsAccessToken || (appInfos == null ? null : appInfos.AppUser.FacebookAccessToken);
  637.       facebookFriendsResultCallback = ResultCallback;
  638.  
  639.       if ((fbFriendsAccessToken == null || fbFriendsAccessToken == "") && (facebookFriends == null || ForceUpdate)) {
  640.          if (typeof ResultCallback == "function") {
  641.             ResultCallback(null);
  642.          }
  643.       }
  644.       else {
  645.          if (facebookFriends == null || ForceUpdate) {
  646.             getFacebookFriends(showFBFriendsDlg, OnLoadCallback, DisplayMe);
  647.          }
  648.          else {
  649.             showFBFriendsDlg(facebookFriends, OnLoadCallback, DisplayMe)
  650.          }
  651.       }
  652.    }
  653.  
  654.    this.SetFacebookFriends = function (data) {
  655.       facebookFriends = data;
  656.    }
  657.  
  658.    function getFacebookFriends(callback, onLoadCallback, displayMe) {
  659.       $.get('https://graph.facebook.com/me/friends?access_token=' + fbFriendsAccessToken + "&fields=id,name,first_name,last_name,gender", function (response) {
  660.          $.get('https://graph.facebook.com/me?access_token=' + fbFriendsAccessToken + "&fields=id,name,first_name,last_name,gender", function (me) {
  661.             response.data.push(me);
  662.             callback(response.data, onLoadCallback, displayMe);
  663.          });
  664.       });
  665.    }
  666.  
  667.    function showFBFriendsDlg(fbResp, onLoadCallback, displayMe) {
  668.       if (fbResp) {
  669.          facebookFriends = fbResp;
  670.          var items = buildFBFriendsItems(null, displayMe);
  671.          Chayns.Select(items, false, fbFriendsCallback, null, function () {
  672.             $("#ChaynsAPISelectionContainer").before("<div style='margin:8px;'><input id='Searchbar' style='width:100%; box-sizing: border-box;' onkeyup='Chayns.searchFBFriendDlg(this, " + displayMe + ");' /></div>");
  673.             $("#Searchbar").focus();
  674.             if (typeof onLoadCallback == "function") {
  675.                onLoadCallback();
  676.             }
  677.          });
  678.       }
  679.       else {
  680.          if (typeof facebookFriendsResultCallback == "function") {
  681.             facebookFriendsResultCallback(null);
  682.          }
  683.       }
  684.    }
  685.  
  686.    this.searchFBFriendDlg = function (obj, displayMe) {
  687.       var text = obj.value.toLowerCase();
  688.       var items = buildFBFriendsItems(text, displayMe);
  689.       var list = '<div id="ChaynsAPISelectionContainer">';
  690.       for (var i = 0; i < items.length; i++) {
  691.          var selected = items[i].Selected ? " selected" : "";
  692.          list += '<div val="' + items[i].Value + '" class="ChaynsAPISelectEntry' + selected + '">' + items[i].Name + '</div>';
  693.       }
  694.       list += '</div>';
  695.       $("#ChaynsAPISelectionContainer").html(list);
  696.       $("#ChaynsAPISelectionContainer>.ChaynsAPISelectEntry").on("click", function () {
  697.          selectDlgItemClicked(this, buildFBFriendsItems(null, displayMe), fbFriendsCallback);
  698.       });
  699.    }
  700.  
  701.    function fbFriendsCallback(val) {
  702.       if (val == null || val < 0) {
  703.          facebookFriendsResultCallback(null);
  704.          return;
  705.       }
  706.       facebookFriendsResultCallback(facebookFriends[val]);
  707.    }
  708.  
  709.    function buildFBFriendsItems(search, displayMe) {
  710.       var template = '<div style="display: table; width: 100%; vertical-align: middle;"><div style="display: table-cell; height: 30px; width: 30px; vertical-align: middle;padding-right: 10px;"><img src="##imgSrc##" style="height: 30px; width: 30px;" /></div><div style="display: table-cell; vertical-align: middle;" class="FacebookUserEntry">##name##</div></div>';
  711.       var items = new Array();
  712.       var i = 0;
  713.       for (i = 0; i < facebookFriends.length; i++) {
  714.          if ((i < facebookFriends.length - 1 || displayMe) && (search == null || facebookFriends[i].name.toLowerCase().search(search) > -1)) {
  715.             var txt = template;
  716.             txt = txt.replace("##imgSrc##", "//graph.facebook.com/" + facebookFriends[i].id + "/picture?width=30&height=30");
  717.             txt = txt.replace("##name##", facebookFriends[i].name);
  718.             items.push(new Chayns.SelectOption(txt, i, false));
  719.          }
  720.       }
  721.       return items;
  722.    }
  723.  
  724.  
  725.    //#endregion
  726.  
  727.    //#region Dialog
  728.  
  729.    this.ShowPopUp = function (Content, Headline, Buttons, NoContentPadding, OnLoad) {
  730.       var strContent = "";
  731.       if (typeof Content === "string")
  732.          strContent = Chayns.Trim(Content.replace(/<br[ /]*?>/g, "\n"));
  733.       if (!Buttons || Buttons.length == 0) {
  734.          Buttons = [new that.PopUpButton("OK")];
  735.       }
  736.  
  737.       if (checkAppVersion({ ANDROID: 2606 }) && Buttons.length <= 3 && typeof Content == "string" && !strContent.match(/<[a-z][^<]*?>/i)) {
  738.          chaynsCall("slitte://chaynsCall(16, 'ChaynsDialogCallBack()'," +
  739.             "'" + encodeURI(Headline ? Headline : "") + "'," +
  740.             "'" + encodeURI(strContent) + "', '" + encodeURI(Buttons[0] ? Buttons[0].Name : "") + "', '" + encodeURI(Buttons[1] ? Buttons[1].Name : "") + "', '" + encodeURI(Buttons[2] ? Buttons[2].Name : "") + "')");
  741.  
  742.          window.ChaynsDialogCallBack = function (ButtonID) {
  743.             ButtonID = parseInt(ButtonID) - 1;
  744.             if (Buttons[ButtonID]) {
  745.                Buttons[ButtonID].CallBack();
  746.             }
  747.  
  748.             delete window.ChaynsDialogCallBack;
  749.          }
  750.       } else {
  751.          if (isJQload()) {
  752.             window.setTimeout(function () {
  753.                var popup = createPopUp();
  754.                var popupHeadline = $("#ChaynsAPIPopupHeadline");
  755.                if (Headline) {
  756.                   popupHeadline.show();
  757.                   popupHeadline.html(Headline);
  758.                } else {
  759.                   popupHeadline.hide();
  760.                }
  761.                var popupcontent = $("#ChaynsAPIPopUpContent");
  762.                popupcontent.html(Content);
  763.  
  764.                if (NoContentPadding)
  765.                   popupcontent.css("padding", "0 !important");
  766.                var popupbuttons = $("#ChaynsAPIPopUpButtons");
  767.  
  768.                popupbuttons.html("");
  769.                createButtons(popupbuttons, Buttons);
  770.  
  771.                $(popup).show();
  772.                $("#ChaynsAPIPopUpOverlay").show();
  773.  
  774.                that.Slitte.AllowRefreshScroll(false);
  775.  
  776.                if (that.OS == "WP8")
  777.                   $(popup).css("max-height", "75%");
  778.  
  779.                if (OnLoad && typeof OnLoad == "function")
  780.                   OnLoad(popupcontent);
  781.  
  782.                resetPopUpSizeAndPos();
  783.             }, 100);
  784.          }
  785.       }
  786.    }
  787.  
  788.    function closePopUp() {
  789.       $("#ChaynsAPIPopUpContainer, #ChaynsAPIPopUpOverlay").hide();
  790.       that.Slitte.AllowRefreshScroll(true);
  791.    }
  792.  
  793.    function createPopUp() {
  794.       var popup = document.getElementById("ChaynsAPIPopUpContainer");
  795.       if (!popup) {
  796.          var chaynsRoot = $("#ChaynsRoot .ChaynsPopUpContainer");
  797.          chaynsRoot.append(createDomElement("div", { id: "ChaynsAPIPopUpOverlay", "class": "PopUpOverLay" }));
  798.  
  799.          var container = createDomElement("div", { id: "ChaynsAPIPopUpContainer", "class": "PopUp" });
  800.          container.appendChild(createDomElement("div", { id: "ChaynsAPIPopupHeadline" }));
  801.          container.appendChild(createDomElement("div", { id: "ChaynsAPIPopUpContent" }));
  802.          container.appendChild(createDomElement("div", { id: "ChaynsAPIPopUpButtons", "class": "PopUpButtons" }));
  803.  
  804.          chaynsRoot.append(container);
  805.  
  806.          $(window).resize(function () {
  807.             if (lastWindowWidth != window.innerWidth || lastWindowHeight < window.innerHeight) {
  808.                lastWindowWidth = window.innerWidth;
  809.                lastWindowHeight = window.innerHeight;
  810.                setTimeout(resetPopUpSizeAndPos, 100);
  811.             }
  812.          });
  813.          return container;
  814.       } else {
  815.          return popup;
  816.       }
  817.    }
  818.  
  819.    function resetPopUpSizeAndPos() {
  820.       var popup = document.getElementById("ChaynsAPIPopUpContainer");
  821.       if (popup) {
  822.          Chayns.GetWindowMetrics(function (data) {
  823.             var contentHeight = (data.AvailHeight * ((that.OS == "WP8") ? 0.75 : 0.9)) - 100;
  824.             if (that.OS == "ANDROID" && that.OSVersion < "3.0") {
  825.                contentHeight -= 60;
  826.             }
  827.             if ($("#ChaynsAPIPopupHeadline").is(":visible")) {
  828.                contentHeight -= 40;
  829.             }
  830.  
  831.             contentHeight = contentHeight < 37 ? 37 : contentHeight;
  832.  
  833.             $("#ChaynsAPIPopUpContent").css("max-height", contentHeight + "px");
  834.  
  835.             var width = ((window.innerWidth - popup.clientWidth) * 0.5);
  836.             if (that.OS != 'ANDROID' && that.DeviceOS != 'ANDROID') {
  837.                width -= 8;
  838.             }
  839.             popup.style.left = width + "px";
  840.  
  841.             createScrollDivs($("#ChaynsAPIPopUpContent"));
  842.  
  843.             var topOffset = ((data.AvailHeight - popup.clientHeight) * 0.5);
  844.             topOffset += data.WindowScrollTop;
  845.  
  846.             if (topOffset < 50) topOffset = 50;
  847.  
  848.             popup.style.top = topOffset + "px";
  849.          });
  850.       }
  851.    }
  852.  
  853.    function createButtons(Parent, Buttons) {
  854.       var buttonsWidth = (100 / Buttons.length) + '%';
  855.       for (var i = 0; i < Buttons.length; i++) {
  856.          var button = function (iCopy) {
  857.             var btn = createDomElement("div", { "class": "PopUpButton" }, Buttons[iCopy].Name);
  858.             if (that.OS == 'ANDROID' || that.DeviceOS == 'ANDROID') {
  859.                btn.style.width = buttonsWidth;
  860.             }
  861.             if (that.OS && that.OS == "ANDROID") {
  862.                btn.style.width = (100 / Buttons.length) + "%";
  863.             }
  864.             var hasClosed = false;
  865.             $(btn).on("click", function (e) {
  866.                try {
  867.                   e.stopPropagation();
  868.                } catch (e) { }
  869.                if (!hasClosed && Buttons[iCopy].CallBack(btn) != false) {
  870.                   hasClosed = true;
  871.                   closePopUp();
  872.                }
  873.             });
  874.             return btn;
  875.          }(i);
  876.  
  877.          Parent.append(button);
  878.       }
  879.    }
  880.  
  881.    function createScrollDivs(popupContent) {
  882.       if (checkIfScrollIsNeeded()) {
  883.          if ($("#ChaynsAPIPopUpContainer .scroll").length > 0) return true;
  884.  
  885.          if (that.OS == "ANDROID" && that.OSVersion < "3.0") {
  886.             $('<div class="scroll up"></div>').insertBefore(popupContent);
  887.             $('<div class="scroll down"></div>').insertAfter(popupContent);
  888.  
  889.             $("#ChaynsAPIPopUpContainer .scroll").on("touchstart", function () {
  890.                var scroll = $("#ChaynsAPIPopUpContent").scrollTop();
  891.                if ($(this).hasClass("up")) {
  892.                   scroll -= 37;
  893.                } else {
  894.                   scroll += 37;
  895.                }
  896.                $("#ChaynsAPIPopUpContent").stop().animate({ scrollTop: scroll + "px" }, 200);
  897.             });
  898.             return true;
  899.          }
  900.          return false;
  901.       } else {
  902.          $("#ChaynsAPIPopUpContainer .scroll").remove();
  903.          return false;
  904.       }
  905.    }
  906.  
  907.    function checkIfScrollIsNeeded() {
  908.       var container = $("#ChaynsAPIPopUpContent")[0];
  909.       return (container.scrollHeight - 10) > container.clientHeight;
  910.    }
  911.  
  912.    //#endregion
  913.  
  914.    //#region SlitteBefehle
  915.  
  916.    //möglich im Webshadow
  917.    this.Slitte.GetFacebookConnect = function (Permissions, ReloadParameter) {
  918.       if (!Permissions) Permissions = 'user_friends';
  919.       if (ReloadParameter == null) ReloadParameter = "comment";
  920.  
  921.       if (checkAppVersion({ ANDROID: 1359, IOS: 1366, WP8: 2469 })) {
  922.          if (Permissions || ReloadParameter) {
  923.             if (useChaynsCall()) {
  924.                chaynsCall("chayns://chaynsCall(7,'" + Permissions + "','ExecCommand=" + ReloadParameter + "')");
  925.             } else {
  926.                chaynsCall("slitte://RequestPermissions?permissions=" + Permissions + "&ExecCommand=" + ReloadParameter);
  927.             }
  928.             return true;
  929.          } else {
  930.             if (useChaynsCall()) {
  931.                chaynsCall("chayns://chaynsCall(8)");
  932.             } else {
  933.                chaynsCall("slitte://facebookconnect");
  934.             }
  935.             return true;
  936.          }
  937.       } else if (loadedInWebshadow) {
  938.          var params = {};
  939.          if (ReloadParameter != null) params.ReloadParameter = 'ExecCommand=' + ReloadParameter;
  940.          if (Permissions != null) params.Permissions = Permissions;
  941.  
  942.          callWebshadowFunction('facebookConnect', JSON.stringify(params));
  943.          return true;
  944.       }
  945.       return false;
  946.    }
  947.  
  948.    //möglich im Webshadow?
  949.    this.Slitte.CreateCaptionButton = function (Text, CallBack) {
  950.       if (checkAppVersion({ ANDROID: 1358, IOS: 1366, WP8: 2469 })) {
  951.          var cbParam = "";
  952.          if (typeof CallBack == "function") {
  953.             that.CaptionButtonCallback = CallBack;
  954.             cbParam = "Chayns.CaptionButtonCallback()";
  955.          } else if (typeof CallBack == "string") {
  956.             that.CaptionButtonCallback = function () { }
  957.  
  958.             if (CallBack.indexOf("(") == -1)
  959.                CallBack += "();";
  960.             cbParam = CallBack;
  961.          } else {
  962.             that.CaptionButtonCallback = function () { }
  963.          }
  964.  
  965.          if (cbParam) {
  966.             if (useChaynsCall()) {
  967.                chaynsCall("chayns://chaynsCall(5,'" + Text + "','" + cbParam + "')");
  968.             } else {
  969.                chaynsCall("slitte://ShowCaptionButton=" + Text + "," + cbParam);
  970.             }
  971.             return true;
  972.          }
  973.       }
  974.       return false;
  975.    }
  976.  
  977.    //möglich im Webshadow?
  978.    this.Slitte.HideCaptionButton = function () {
  979.       if (checkAppVersion({ ANDROID: 1358, IOS: 1366, WP8: 2469 })) {
  980.          if (useChaynsCall()) {
  981.             chaynsCall("chayns://chaynsCall(6)");
  982.          } else {
  983.             chaynsCall("slitte://HideCaptionButton");
  984.          }
  985.          return true;
  986.       }
  987.       return false;
  988.    }
  989.  
  990.    this.Slitte.OpenInterCom = function () {
  991.       if (checkAppVersion({ ANDROID: 2402, IOS: 1383, WP8: 2543 })) {
  992.          if (useChaynsCall()) {
  993.             chaynsCall("chayns://chaynsCall(12)");
  994.          } else {
  995.             chaynsCall("slitte://selectInterCom");
  996.          }
  997.          return true;
  998.       }
  999.       return false;
  1000.    }
  1001.  
  1002.    //möglich im Webshadow
  1003.    this.Slitte.SelectOtherTab = function (Tab, Parameter) {
  1004.       if (checkAppVersion({ ANDROID: 2402, IOS: 1383, WP8: 2469 })) {
  1005.          if (typeof Tab == "string" || typeof Tab == "number") {
  1006.             if (useChaynsCall()) {
  1007.                if (typeof Parameter === "string") {
  1008.                   if (!Parameter.match(/^[&|\?]/)) {
  1009.                      Parameter = "&" + Parameter;
  1010.                   }
  1011.                   Parameter = Parameter.replace(/^\?/, "&");
  1012.                   chaynsCall("chayns://chaynsCall(13,'" + Tab + "','" + Parameter + "')");
  1013.                } else {
  1014.                   chaynsCall("chayns://chaynsCall(2,'" + Tab + "')");
  1015.                }
  1016.             } else {
  1017.                chaynsCall("slitte://selectTab('" + Tab + "')");
  1018.             }
  1019.             return true;
  1020.          }
  1021.       } else if (loadedInWebshadow) {
  1022.          var paramsObj = {
  1023.             Tab: Tab,
  1024.             Parameter: Parameter
  1025.          };
  1026.          callWebshadowFunction('selectothertab', JSON.stringify(paramsObj));
  1027.       }
  1028.       return false;
  1029.    }
  1030.  
  1031.    //möglich im Webshadow in manchen browsern
  1032.    this.Slitte.ShowBackButton = function (CallBack) {
  1033.       if (checkAppVersion({ ANDROID: 2405, IOS: 2636, WP8: 2469 })) {
  1034.          var cbParam = "";
  1035.          if (typeof CallBack == "function") {
  1036.             that.BackButtonCallback = CallBack;
  1037.             cbParam = "Chayns.BackButtonCallback()";
  1038.          } else if (typeof CallBack == "string") {
  1039.             if (CallBack.indexOf("(") == -1) CallBack += "()";
  1040.             cbParam = CallBack;
  1041.          } else {
  1042.             that.BackButtonCallback = function () {
  1043.                that.HideBackButton();
  1044.                history.back();
  1045.             }
  1046.             cbParam = "Chayns.BackButtonCallback()";
  1047.          }
  1048.  
  1049.          if (cbParam) {
  1050.             if (useChaynsCall()) {
  1051.                chaynsCall("chayns://chaynsCall(10,'" + cbParam + "')");
  1052.             } else {
  1053.                chaynsCall("slitte://showBackButton," + cbParam);
  1054.             }
  1055.             return true;
  1056.          }
  1057.       }
  1058.       return false;
  1059.    }
  1060.  
  1061.    //möglich im Webshadow in manchen browsern
  1062.    this.Slitte.HideBackButton = function () {
  1063.       if (checkAppVersion({ ANDROID: 2405, IOS: 2636, WP8: 2469 })) {
  1064.          if (useChaynsCall()) {
  1065.             chaynsCall("chayns://chaynsCall(11)");
  1066.          } else {
  1067.             chaynsCall("slitte://hideBackButton");
  1068.          }
  1069.          return true;
  1070.       }
  1071.       return false;
  1072.    }
  1073.  
  1074.    this.Slitte.OpenLinkInBrowser = function (Url) {
  1075.       if (checkAppVersion({ ANDROID: 2405, IOS: 2466, WP8: 2543 })) {
  1076.          if (typeof Url == "string") {
  1077.             chaynsCall("chayns://chaynsCall(9,'" + Url + "')");
  1078.             return true;
  1079.          }
  1080.       } else if (loadedInWebshadow) {
  1081.          if (typeof Url == 'string') {
  1082.             if (Url.indexOf('http') != 0) {
  1083.                Url = 'http://' + Url;
  1084.             }
  1085.             window.open(Url, '_blank');
  1086.             return true;
  1087.          }
  1088.       }
  1089.       return false;
  1090.    }
  1091.  
  1092.    //möglich im Webshadow, aber ungenau
  1093.    this.Slitte.GetLongLat = function (CallBack, ContinuousTracking) {
  1094.       if (checkAppVersion({ ANDROID: 2501, IOS: 2466, WP8: 2469 })) {
  1095.          var cbParam = 'null';
  1096.          if (typeof CallBack == 'function') {
  1097.             getLongLatCallBack = CallBack;
  1098.             cbParam = "'Chayns.GetLngLatCallBack()'";
  1099.          }
  1100.          if (ContinuousTracking != true) {
  1101.             ContinuousTracking = false;
  1102.          }
  1103.          singelGeoCoordinatesResponse = !ContinuousTracking;
  1104.  
  1105.          chaynsCall("chayns://chaynsCall(14," + cbParam + ")");
  1106.          return true;
  1107.       }
  1108.       return false;
  1109.    };
  1110.  
  1111.    this.Slitte.AllowRefreshScroll = function (State) {
  1112.       if (checkAppVersion({ ANDROID: 2501 })) {
  1113.          chaynsCall("chayns://chaynsCall(0," + (State ? "true" : "false") + ")");
  1114.          return true;
  1115.       }
  1116.       return false;
  1117.    }
  1118.  
  1119.    //möglich im Webshadow
  1120.    this.Slitte.ShowWaitCursor = function (State) {
  1121.       if (useChaynsCall()) {
  1122.          chaynsCall("chayns://chaynsCall(1," + (State ? "true" : "false") + ")");
  1123.          return true;
  1124.       } else if (loadedInWebshadow) {
  1125.          callWebshadowFunction((State ? 'show' : 'hide') + 'LoadingCursor');
  1126.          return true;
  1127.       }
  1128.       return false;
  1129.    }
  1130.  
  1131.    //möglich im Webshadow
  1132.    this.Slitte.ShowPicture = function (Url) {
  1133.       if (checkAppVersion({ ANDROID: 2501, IOS: 2636, WP8: 2543 })) {
  1134.          if (typeof Url == "string" && Url.match(/jpg$|png$|gif$/i)) {
  1135.             chaynsCall("chayns://chaynsCall(4,'" + Url + "')");
  1136.             return true;
  1137.          }
  1138.       } else if (loadedInWebshadow) {
  1139.          callWebshadowFunction('showPicture', Url);
  1140.       }
  1141.       return false;
  1142.    }
  1143.  
  1144.    this.NfcResponseData = {
  1145.       RFID: 0,
  1146.       PersonID: 1
  1147.    };
  1148.    this.Slitte.SetNfcCallBack = function (CallBack, ResponseData) {
  1149.       if (typeof CallBack == 'function') {
  1150.          if (checkAppVersion({ ANDROID: 3234, WP8: 3121 })) {
  1151.             that.NfcCallBack = CallBack;
  1152.             var chaynsCallNr = (ResponseData == that.NfcResponseData.PersonID) ? 37 : 38;
  1153.             chaynsCall("chayns://chaynsCall(" + (chaynsCallNr == 37 ? 38 : 37) + ",null)");
  1154.             chaynsCall("chayns://chaynsCall(" + chaynsCallNr + ",'Chayns.NfcCallBack')");
  1155.             return true;
  1156.          }
  1157.       } else if (CallBack == null) {
  1158.          chaynsCall("chayns://chaynsCall(37,null)");
  1159.          chaynsCall("chayns://chaynsCall(37,null)");
  1160.       }
  1161.       return false;
  1162.    }
  1163.  
  1164.    //möglich im Webshadow, wenn alben als tapp vorhanden
  1165.    this.Slitte.SelectAlbum = function (AlbumName) {
  1166.       if (typeof AlbumName === "string") {
  1167.          if (useChaynsCall()) {
  1168.             chaynsCall("chayns://chaynsCall(3,'" + AlbumName + "')");
  1169.             return true;
  1170.          } else if (loadedInWebshadow) {
  1171.             callWebshadowFunction('selectAlbum', AlbumName);
  1172.          }
  1173.       }
  1174.       return false;
  1175.    }
  1176.  
  1177.    //möglich im Webshadow
  1178.    this.Slitte.ShowVideo = function (VideoURL) {
  1179.       if (typeof VideoURL === "string") {
  1180.          if (VideoURL.match(/.*\..{2,}/) && useChaynsCall()) {
  1181.             chaynsCall("chayns://chaynsCall(15,'" + VideoURL + "')");
  1182.             return true;
  1183.          } else if (loadedInWebshadow) {
  1184.             callWebshadowFunction('showVideo', VideoURL);
  1185.          }
  1186.       }
  1187.       return false;
  1188.    }
  1189.  
  1190.    //möglich im Webshadow
  1191.    this.Slitte.GetAppInfos = function (CallBack, forceReload) {
  1192.       if (appInfos && !forceReload) {
  1193.          if (typeof CallBack == "function") {
  1194.             CallBack(appInfos);
  1195.             return true;
  1196.          }
  1197.       } else {
  1198.          if (typeof CallBack == "function") {
  1199.             getAppInfosUserCallBacks.push(CallBack);
  1200.          }
  1201.          if (that.OS && that.OS != 'BLACKBERRY' && !loadedInWebshadow) {//checkAppVersion({ "ANDROID": 2660, "IOS": 2579, "WP8": 2521 })
  1202.             chaynsCall("chayns://chaynsCall(18,'Chayns.GetAppInfosCallBack()')");
  1203.             return true;
  1204.          } else if (loadedInWebshadow) {
  1205.             callWebshadowFunction('getAppInfos', '');//TODO: callback behandeln
  1206.             return true;
  1207.          } else {
  1208.             for (var i = 0; i < getAppInfosUserCallBacks.length; i++) {
  1209.                getAppInfosUserCallBacks[i](null);
  1210.             }
  1211.             getAppInfosUserCallBacks = [];
  1212.          }
  1213.       }
  1214.       return false;
  1215.    }
  1216.  
  1217.    this.Slitte.Vibrate = function (Duration) {
  1218.       if (checkAppVersion({ "ANDROID": 2695, "IOS": 2596, "WP8": 2515 })) {
  1219.          Duration = (typeof Duration == "number") ? Duration : 150;
  1220.          chaynsCall("chayns://chaynsCall(19, " + Duration.toString() + ")");
  1221.          return true;
  1222.       }
  1223.       return false;
  1224.    }
  1225.  
  1226.    //möglich im Webshadow history.back()
  1227.    this.Slitte.NavigateBack = function () {
  1228.       if (checkAppVersion({ "ANDROID": 2696, "IOS": 2600, "WP8": 2515 })) {
  1229.          chaynsCall("chayns://chaynsCall(20)");
  1230.          return true;
  1231.       }
  1232.       return false;
  1233.    }
  1234.  
  1235.    //möglich im Webshadow
  1236.    this.Slitte.UploadImage = function (CallBack) {
  1237.       if (checkAppVersion({ "ANDROID": 2705, "WP8": 2538, "IOS": 2642 }) && typeof CallBack === "function") {
  1238.          that.ImageUploadCallBack = CallBack;
  1239.          chaynsCall("chayns://chaynsCall(21, 'Chayns.ImageUploadCallBack()')");
  1240.          return true;
  1241.       }
  1242.       return false;
  1243.    }
  1244.  
  1245.    //möglich im Webshadow (HTML5)
  1246.    this.Slitte.Player = {
  1247.       Pause: function () {
  1248.          if (checkAppVersion({ "ANDROID": 2752, "IOS": 2644, "WP8": 2543 })) {
  1249.             chaynsCall("chayns://chaynsCall(24, 0)");
  1250.             return true;
  1251.          }
  1252.          return false;
  1253.       },
  1254.       Play: function () {
  1255.          if (checkAppVersion({ "ANDROID": 2752, "IOS": 2644, "WP8": 2543 })) {
  1256.             chaynsCall("chayns://chaynsCall(24, 1)");
  1257.             return true;
  1258.          }
  1259.          return false;
  1260.       },
  1261.       ChangeUrl: function (newUrl) {
  1262.          if (checkAppVersion({ "ANDROID": 2752, "IOS": 2644, "WP8": 2543 })) {
  1263.             chaynsCall("chayns://chaynsCall(22, '" + newUrl + "')");
  1264.             return true;
  1265.          }
  1266.          return false;
  1267.       },
  1268.       UseDefaultUrl: function () {
  1269.          if (checkAppVersion({ "ANDROID": 2752, "IOS": 2644, "WP8": 2543 })) {
  1270.             chaynsCall("chayns://chaynsCall(22, 0)");
  1271.             return true;
  1272.          }
  1273.          return false;
  1274.       },
  1275.       HideButton: function () {
  1276.          if (checkAppVersion({ "ANDROID": 2752, "IOS": 2644, "WP8": 2543 })) {
  1277.             chaynsCall("chayns://chaynsCall(23, 0)");
  1278.             return true;
  1279.          }
  1280.          return false;
  1281.       },
  1282.       ShowButton: function () {
  1283.          if (checkAppVersion({ "ANDROID": 2752, "IOS": 2644, "WP8": 2543 })) {
  1284.             chaynsCall("chayns://chaynsCall(23, 1)");
  1285.             return true;
  1286.          }
  1287.          return false;
  1288.       },
  1289.       GetPlaybackStatus: function (CallBack) {
  1290.          if (checkAppVersion({ "ANDROID": 2754, "IOS": 2644 })) {
  1291.             if (typeof CallBack == "function") {
  1292.                Chayns.Slitte.GetAppInfos(function (infoObj) {
  1293.                   CallBack({
  1294.                      AppControlVisible: infoObj.AppInfo.PlaybackInfo.IsAppControlVisible,
  1295.                      Status: infoObj.AppInfo.PlaybackInfo.PlaybackStatus,
  1296.                      Url: infoObj.AppInfo.PlaybackInfo.StreamUrl
  1297.                   });
  1298.                }, true);
  1299.             }
  1300.          }
  1301.          return false;
  1302.       }
  1303.    }
  1304.  
  1305.    this.Slitte.Bluetooth = {
  1306.       LE_SendStrength: {
  1307.          Adjacent: 0,
  1308.          Nearby: 1,
  1309.          Default: 2,
  1310.          Far: 3
  1311.       },
  1312.       LE_Scan: function (CallBack) {
  1313.          if (checkAppVersion({ "ANDROID": 2771, "IOS": 2651 })) {
  1314.             if (typeof CallBack == "function") {
  1315.                bleResponseCallback = CallBack;
  1316.                chaynsCall("chayns://chaynsCall(26, 'Chayns.BLECallBack')");
  1317.                return true;
  1318.             }
  1319.          }
  1320.          return false;
  1321.       },
  1322.       LE_Connect: function (Address, CallBack, Password) {
  1323.          if (checkAppVersion({ "ANDROID": 2771, "IOS": 2651 })) {
  1324.             if (typeof Address == "string" && that.IsBLEAdress(Address)) {
  1325.                if (typeof CallBack == "function") {
  1326.                   bleResponseCallback = CallBack;
  1327.                   if (typeof Password != "string" || !Password.match(/^[0-9a-f]{6,12}$/i)) {
  1328.                      Password = '';
  1329.                   }
  1330.                   chaynsCall("chayns://chaynsCall(27, '" + Address + "','" + Password + "')");
  1331.                   return true;
  1332.                }
  1333.             }
  1334.          }
  1335.          return false;
  1336.       },
  1337.       LE_Write: function (Address, SubID, MeasurePower, SendStrength, CallBack) {
  1338.          if (checkAppVersion({ "ANDROID": 2771, "IOS": 2651 })) {
  1339.             if (typeof Address == "string" && that.IsBLEAdress(Address)) {
  1340.                if (typeof SubID != 'number' || SubID < 0 || SubID > 4095) {
  1341.                   SubID = 'null';
  1342.                }
  1343.                if (typeof MeasurePower != 'number' || MeasurePower < -100 || MeasurePower > 0) {
  1344.                   MeasurePower = 'null';
  1345.                }
  1346.                if (typeof SendStrength != 'number' || SendStrength < 0 || SendStrength > 3) {
  1347.                   SendStrength = 'null';
  1348.                }
  1349.                if (SubID != 'null' || MeasurePower != 'null' || SendStrength != 'null') {
  1350.                   bleResponseCallback = (typeof CallBack == "function") ? CallBack : null;
  1351.  
  1352.                   chaynsCall("chayns://chaynsCall(28, '" + Address + "','7A07E17A-A188-416E-B7A0-5A3606513E57'," + SubID + "," + MeasurePower + "," + SendStrength + ")");
  1353.                   return true;
  1354.                }
  1355.             }
  1356.          }
  1357.          return false;
  1358.       }
  1359.    };
  1360.  
  1361.    //möglich im Webshadow? (custom handlers)
  1362.    this.Slitte.SaveAppointment = function (name, location, description, start, end) {
  1363.       if (checkAppVersion({ 'ANDROID': 3054, 'WP8': 3030, 'IOS': 3067 })) {
  1364.          if (typeof start != 'number' && start instanceof Date) {
  1365.             start = parseInt(start.getTime() / 1000);
  1366.          } else { return false; }
  1367.          if (typeof end != 'number') {
  1368.             end = parseInt(end.getTime() / 1000);
  1369.          } else { return false; }
  1370.          chaynsCall("chayns://chaynsCall(29,'" + name + "','" + location + "','" + description + "'," + start + "," + end + ")");
  1371.          return true;
  1372.       }
  1373.       return false;
  1374.    }
  1375.  
  1376.    this.DateSelectTypes = {
  1377.       Date: 1,
  1378.       Time: 2,
  1379.       DateTime: 3
  1380.    };
  1381.  
  1382.    this.Slitte.DateSelect = function (DateSelectType, Preselect, CallBack, MinDate, MaxDate) {
  1383.       if (checkAppVersion({ 'ANDROID': 3072, 'WP8': 3030, 'IOS': 3062 })) {//WP8 unterstützt min/maxDate noch nicht
  1384.          if (typeof CallBack == 'function' && typeof DateSelectType == 'number' && DateSelectType > 0) {
  1385.             if (typeof Preselect != 'number') {
  1386.                if (Preselect instanceof Date) {
  1387.                   Preselect = parseInt(Preselect.getTime() / 1000);
  1388.                } else {
  1389.                   Preselect = -1;
  1390.                }
  1391.             }
  1392.             if (typeof MinDate != 'number') {
  1393.                if (MinDate instanceof Date) {
  1394.                   MinDate = parseInt(MinDate.getTime() / 1000);
  1395.                } else {
  1396.                   MinDate = -1;
  1397.                }
  1398.             }
  1399.             if (typeof MaxDate != 'number') {
  1400.                if (MaxDate instanceof Date) {
  1401.                   MaxDate = parseInt(MaxDate.getTime() / 1000);
  1402.                } else {
  1403.                   MaxDate = -1;
  1404.                }
  1405.             }
  1406.             var dateRange = '';
  1407.             if (MinDate > -1 && MaxDate > -1) {
  1408.                dateRange = ',' + MinDate + ',' + MaxDate;
  1409.             }
  1410.             dateSelectCallBackOptions = {
  1411.                'Function': CallBack,
  1412.                'Preselect': Preselect,
  1413.                'SelectType': DateSelectType
  1414.             };
  1415.             chaynsCall("chayns://chaynsCall(30, 'Chayns.DateSelectCallBack'," + DateSelectType + "," + Preselect + dateRange + ")");
  1416.             return true;
  1417.          }
  1418.       }
  1419.       return false;
  1420.    };
  1421.  
  1422.    //möglich im Webshadow, wenn navigate back auch klappt
  1423.    this.Slitte.ShowUrlInApp = function (URL, Title) {
  1424.       if (typeof URL == 'string') {
  1425.          if (checkAppVersion({ 'ANDROID': 3110, 'WP8': 3063, 'IOS': 3074 })) {
  1426.             var titleParam = "";
  1427.             if (typeof Title == 'string' && Title != '') {
  1428.                titleParam = ",'" + Title + "'";
  1429.             }
  1430.             chaynsCall("chayns://chaynsCall(31, '" + URL + "'" + titleParam + ")");
  1431.             return true;
  1432.          }
  1433.       }
  1434.       return false;
  1435.    }
  1436.  
  1437.    this.Slitte.CreateQRCode = function (DataStr, CallBack) {
  1438.       if (checkAppVersion({ 'ANDROID': 3220, 'WP8': 3106, 'IOS': 1372 })) {//TODO iOS-Version einfügen
  1439.          if (typeof DataStr != 'string') {
  1440.             DataStr = JSON.stringify(DataStr);
  1441.          }
  1442.  
  1443.          var callbackStr = '';
  1444.          if (typeof CallBack == 'function') {
  1445.             createQRCodeCallBack = CallBack;
  1446.             callbackStr = ",'Chayns.CreateQRCodeCallBack()'";
  1447.          }
  1448.  
  1449.          chaynsCall("chayns://chaynsCall(33,'" + DataStr + "'" + callbackStr + ")");
  1450.          return true;
  1451.       }
  1452.       return false;
  1453.    };
  1454.  
  1455.    this.Slitte.ScanQRCode = function (CallBack) {
  1456.       if (typeof CallBack == 'function') {
  1457.          if (checkAppVersion({ 'ANDROID': 3220, 'WP8': 3106, 'IOS': 1372 })) {//TODO iOS-Version einfügen
  1458.             Chayns.ScanQRCodeCallBack = CallBack;
  1459.             chaynsCall("chayns://chaynsCall(34, 'Chayns.ScanQRCodeCallBack()')");
  1460.             return true;
  1461.          }
  1462.       }
  1463.       return false;
  1464.    };
  1465.  
  1466.    this.Slitte.GetLocationBeacons = function (CallBack, forceReload) {
  1467.       if (checkAppVersion({ 'ANDROID': 4045, 'IOS': 4048 })) {
  1468.          if (typeof CallBack == 'function') {
  1469.             if (beaconList && !forceReload) {
  1470.                CallBack(beaconList);
  1471.             } else {
  1472.                beaconListCallBack = CallBack;
  1473.                chaynsCall("chayns://chaynsCall(39,'Chayns.GetBeaconsCallBack()')");
  1474.             }
  1475.          }
  1476.       }
  1477.    };
  1478.  
  1479.    //#endregion
  1480.  
  1481.    //#region API-Funktionen
  1482.  
  1483.    this.API.GetIntroText = function (SiteID, TappID, justLoad, CallBack) {
  1484.       if (isJQload()) {
  1485.          if (SiteID && TappID != null) {
  1486.             $.getJSON("//chayns1.tobit.com/TappApi/Tapp/IntroText", { SiteID: SiteID, TappID: TappID }, function (response) {
  1487.                if (response.ResultCode == 0) {
  1488.                   if (justLoad) {
  1489.                      if (typeof CallBack == "function")
  1490.                         CallBack(response.Data.IntroText);
  1491.                   } else {
  1492.                      var getIntro = that.SetIntroText(response.Data.IntroText);
  1493.                      if (typeof CallBack == "function")
  1494.                         CallBack(getIntro);
  1495.                   }
  1496.                }
  1497.             });
  1498.          }
  1499.       }
  1500.    }
  1501.  
  1502.    this.API.GetLocationUsers = function (fn, forceReload) {
  1503.       if (locationUsers === null || forceReload) {
  1504.          if (isJQload()) {
  1505.             $.ajax({
  1506.                url: "//chayns1.tobit.com/TappApi/User/GetAllLocationUsers",//TODO
  1507.                data: {
  1508.                   SiteID: that.SiteID
  1509.                },
  1510.                cache: false,
  1511.                crossDomain: true,
  1512.                type: "GET"
  1513.             }).done(function (data) {
  1514.                if (data && data.Status && data.Status.ResultCode == 0) {
  1515.                   for (var i = 0; i < data.Value.length; i++) {
  1516.                      data.Value[i].PictureLink = "http://graph.facebook.com/" + data.Value[i].ID + "/picture";
  1517.                   }
  1518.                   locationUsers = data.Value;
  1519.                   if (typeof fn === "function") {
  1520.                      fn(locationUsers);
  1521.                   }
  1522.                } else {
  1523.                   if (typeof fn === "function") {
  1524.                      fn(null);
  1525.                   }
  1526.                }
  1527.             }).fail(function () {
  1528.                if (typeof fn === "function") {
  1529.                   fn(null);
  1530.                }
  1531.             });
  1532.          }
  1533.       } else {
  1534.          if (typeof fn === "function") {
  1535.             fn(locationUsers);
  1536.          }
  1537.       }
  1538.    }
  1539.  
  1540.    this.API.GetUACGroups = function (fn, forceReload) {
  1541.       if (uacGroups === null || forceReload) {
  1542.          if (isJQload()) {
  1543.             $.ajax({
  1544.                url: "//chayns1.tobit.com/TappApi/Tapp/GetUACGroups",//TODO
  1545.                data: {
  1546.                   SiteID: that.SiteID
  1547.                },
  1548.                cache: false,
  1549.                crossDomain: true,
  1550.                type: "GET"
  1551.             }).done(function (data) {
  1552.                if (data && data.Status && data.Status.ResultCode == 0) {
  1553.                   uacGroups = data.Value;
  1554.                   if (typeof fn === "function") {
  1555.                      fn(uacGroups);
  1556.                   }
  1557.                } else {
  1558.                   if (typeof fn === "function") {
  1559.                      fn(null);
  1560.                   }
  1561.                }
  1562.             }).fail(function () {
  1563.                if (typeof fn === "function") {
  1564.                   fn(null);
  1565.                }
  1566.             });
  1567.          }
  1568.       } else {
  1569.          if (typeof fn === "function") {
  1570.             fn(uacGroups);
  1571.          }
  1572.       }
  1573.    }
  1574.  
  1575.    this.API.IsUserAdminOfLocation = function (userFBID, fn, forceReload) {
  1576.       if (userFBID) {
  1577.          if (userFBID in isAdminList && !forceReload) {
  1578.             if (typeof fn === "function") {
  1579.                fn(isAdminList[userFBID]);
  1580.             }
  1581.          } else {
  1582.             if (isJQload()) {
  1583.                $.ajax({
  1584.                   url: "//chayns1.tobit.com/TappApi/User/IsUserAdmin",//TODO
  1585.                   data: {
  1586.                      SiteID: that.SiteID,
  1587.                      FBID: userFBID
  1588.                   },
  1589.                   cache: false,
  1590.                   crossDomain: true,
  1591.                   type: "GET"
  1592.                }).done(function (data) {
  1593.                   if (data && data.Status.ResultCode == 0) {
  1594.                      isAdminList[userFBID] = data.Value;
  1595.                      if (typeof fn === "function") {
  1596.                         fn(data.Value);
  1597.                      }
  1598.                   } else {
  1599.                      if (typeof fn === "function") {
  1600.                         fn(null);
  1601.                      }
  1602.                   }
  1603.                }).fail(function () {
  1604.                   if (typeof fn === "function") {
  1605.                      fn(null);
  1606.                   }
  1607.                });
  1608.             }
  1609.          }
  1610.       }
  1611.    }
  1612.  
  1613.    this.API.SendInterComMessage = function (reciever, name, fbToken, finished) {//default im dialog
  1614.       if (typeof reciever === "string") {
  1615.          var getDataFunction = null;
  1616.          if (reciever.toLowerCase() == "user") {
  1617.             getDataFunction = that.API.GetLocationUsers;
  1618.          } else if (reciever.toLowerCase() == "group") {
  1619.             getDataFunction = that.API.GetUACGroups;
  1620.          } else {//site || FacebookID
  1621.             showInterComMsgDialog(reciever, name);
  1622.             return;
  1623.          }
  1624.  
  1625.          getDataFunction(function myfunction(list) {
  1626.             var options = [];
  1627.             for (var i = 0; i < list.length; i++) {
  1628.                options.push(new that.SelectOption(list[i].Name, list[i].ID));
  1629.             }
  1630.  
  1631.             that.Select(options, false, showInterComMsgDialog);
  1632.          });
  1633.       }
  1634.  
  1635.       function showInterComMsgDialog(id, showName) {
  1636.          that.ShowPopUp('<textarea class="borderbox" style="width: 100%;"></textarea>', "Nachricht an " + (name || showName || id),
  1637.             [new that.PopUpButton("Abbrechen"), new that.PopUpButton("Senden", function () {
  1638.                var msg = that.Trim($("#ChaynsAPIPopUpContent>textarea").val());
  1639.                if (msg != "") {
  1640.                   if (reciever.toLowerCase() == "group") {
  1641.                      that.API.SendInterComMessageToGroup(fbToken, id, msg, finished);
  1642.                   } else if (reciever.toLowerCase() == "user") {
  1643.                      that.API.SendInterComMessageToUser(fbToken, id, msg, finished);
  1644.                   } else if (reciever.toLowerCase() == 'site') {
  1645.                      that.API.SendInterComMessageAsUser(fbToken, msg, finished);
  1646.                   } else {//reciever == FacebookID
  1647.                      that.API.SendInterComMessageToUser(fbToken, id, msg, finished);
  1648.                   }
  1649.                } else {
  1650.                   return false;
  1651.                }
  1652.             })], false, function (content) {
  1653.                var input = $(content).find("textarea").on("scroll keyup", function () {
  1654.                   $(this).height(0);
  1655.                   var height = this.scrollHeight + 2;
  1656.                   if (height < 80)
  1657.                      height = 80;
  1658.                   $(this).height(height);
  1659.                }).focus();
  1660.  
  1661.                input.height(0);
  1662.                var height = input[0].scrollHeight + 2;
  1663.                if (height < 80)
  1664.                   height = 80;
  1665.                input.height(height);
  1666.             });
  1667.       }
  1668.    }
  1669.  
  1670.    this.API.SendInterComMessageAsUser = function (fbToken, message, fn) {
  1671.       if (fbToken && message && isJQload()) {
  1672.          $.ajax({
  1673.             url: "//chayns1.tobit.com/TappApi/User/SendInterComMessageAsUser",
  1674.             data: {
  1675.                SiteID: that.SiteID,
  1676.                AccessToken: fbToken,
  1677.                Message: message
  1678.             },
  1679.             cache: false,
  1680.             crossDomain: true,
  1681.             type: "GET"
  1682.          }).done(function (data) {
  1683.             if (typeof fn === "function") {
  1684.                fn(data.ResultCode == 0)
  1685.             }
  1686.          }).fail(function () {
  1687.             if (typeof fn === "function") {
  1688.                fn(false);
  1689.             }
  1690.          });
  1691.       }
  1692.    }
  1693.  
  1694.    this.API.SendInterComMessageToUser = function (fbToken, toFBID, message, fn) {
  1695.       if (fbToken && toFBID && message && isJQload()) {
  1696.          $.ajax({
  1697.             url: "//chayns1.tobit.com/TappApi/Tapp/SendIntercomMessageAsPage",
  1698.             data: {
  1699.                SiteID: that.SiteID,
  1700.                AccessToken: fbToken,
  1701.                ToFBID: toFBID,
  1702.                Message: message
  1703.             },
  1704.             cache: false,
  1705.             crossDomain: true,
  1706.             type: "GET"
  1707.          }).done(function (data) {
  1708.             if (typeof fn === "function") {
  1709.                fn(data.ResultCode == 0)
  1710.             }
  1711.          }).fail(function () {
  1712.             if (typeof fn === "function") {
  1713.                fn(false);
  1714.             }
  1715.          });
  1716.       }
  1717.    }
  1718.  
  1719.    this.API.SendInterComMessageToGroup = function (fbToken, toGroupID, message, fn) {
  1720.       if (fbToken && toGroupID !== undefined && message && isJQload()) {
  1721.          $.ajax({
  1722.             url: "//chayns1.tobit.com/TappApi/Tapp/SendIntercomMessageAsPageToGroup",
  1723.             data: {
  1724.                SiteID: that.SiteID,
  1725.                AccessToken: fbToken,
  1726.                ToGroupID: toGroupID,
  1727.                Message: message
  1728.             },
  1729.             cache: false,
  1730.             crossDomain: true,
  1731.             type: "GET"
  1732.          }).done(function (data) {
  1733.             if (typeof fn === "function") {
  1734.                fn(data.ResultCode == 0)
  1735.             }
  1736.          }).fail(function () {
  1737.             if (typeof fn === "function") {
  1738.                fn(false);
  1739.             }
  1740.          });
  1741.       }
  1742.    }
  1743.  
  1744.    //#endregion
  1745.  
  1746.    //#region Helper
  1747.  
  1748.    this.GetTimeStr = function (PrintDate, PrintDate2) {
  1749.       var retStr = "";
  1750.       if (PrintDate == null) {//Jetzt
  1751.          PrintDate = new Date();
  1752.       }
  1753.       if (PrintDate && PrintDate.getHours) {//DateObj
  1754.          retStr += PrintDate.getHours() + ":";
  1755.          retStr += (PrintDate.getMinutes() < 10) ? "0" + PrintDate.getMinutes() : PrintDate.getMinutes();
  1756.          if (PrintDate2 && PrintDate2.getHours) {
  1757.             retStr += " - ";
  1758.             retStr += PrintDate2.getHours() + ":";
  1759.             retStr += (PrintDate2.getMinutes() < 10) ? "0" + PrintDate2.getMinutes() : PrintDate2.getMinutes();
  1760.          }
  1761.          retStr += " Uhr";
  1762.       }
  1763.       return retStr;
  1764.    }
  1765.  
  1766.    this.GetDateStr = function (PrintDate, withTime, PrintDate2) {
  1767.       var retStr = "";
  1768.       if (PrintDate == null) {
  1769.          PrintDate = new Date();
  1770.       }
  1771.       if (PrintDate && PrintDate.getDay) {
  1772.          retStr += that.GetDayName(PrintDate, true) + ", ";
  1773.          retStr += PrintDate.getDate() + ". ";
  1774.          retStr += that.MonthNames[PrintDate.getMonth()];
  1775.          if (withTime) {
  1776.             if (!PrintDate2 || (PrintDate2.getDate && PrintDate.getFullYear() == PrintDate2.getFullYear() && PrintDate.getMonth() == PrintDate.getMonth() && PrintDate.getDate() == PrintDate2.getDate())) {
  1777.                retStr += ", ";
  1778.                retStr += that.GetTimeStr(PrintDate, PrintDate2);
  1779.             } else {
  1780.                retStr += ", ";
  1781.                retStr += that.GetTimeStr(PrintDate) + " - " + that.GetDateStr(PrintDate2, withTime);
  1782.             }
  1783.          } else if (PrintDate2 && PrintDate2.getDate) {
  1784.             retStr += " - " + that.GetDateStr(PrintDate2);
  1785.          }
  1786.       }
  1787.       return retStr;
  1788.    }
  1789.  
  1790.    this.GetDayName = function (date, camelCase) {
  1791.       var now = new Date();
  1792.       var yesterday = new Date(now.getTime() - 86400000);//ein Tag
  1793.       var tomorrow = new Date(now.getTime() + 86400000);
  1794.       var retval = "";
  1795.       if (date.getDate() == now.getDate() && date.getMonth() == now.getMonth() && date.getFullYear() == now.getFullYear())
  1796.          retval = getLang('$txt_default_TimeDiffArray', 'Gestern,Heute,Morgen').split(',')[1]; // "Heute";
  1797.       else if (date.getDate() == yesterday.getDate() && date.getMonth() == yesterday.getMonth() && date.getFullYear() == yesterday.getFullYear())
  1798.          retval = getLang('$txt_default_TimeDiffArray', 'Gestern,Heute,Morgen').split(',')[0]; // "Gestern";
  1799.       else if (date.getDate() == tomorrow.getDate() && date.getMonth() == tomorrow.getMonth() && date.getFullYear() == tomorrow.getFullYear())
  1800.          retval = getLang('$txt_default_TimeDiffArray', 'Gestern,Heute,Morgen').split(',')[2]; // "Morgen";
  1801.       else
  1802.          retval = that.DayNames[date.getDay()];
  1803.  
  1804.       if (!camelCase)
  1805.          retval = retval.toLowerCase();
  1806.       return retval;
  1807.    }
  1808.  
  1809.    this.StringReplace = function (string, replacements) {
  1810.       if (string && typeof replacements == "object") {
  1811.          for (var key in replacements) {
  1812.             string = string.replace(new RegExp(key, "gi"), replacements[key]);
  1813.          }
  1814.       }
  1815.       return string;
  1816.    }
  1817.  
  1818.    this.GetWindowMetrics = function (CallBack) {
  1819.       if (typeof CallBack === "function") {
  1820.          if (window != window.top) {
  1821.             var messageRecieved = false;
  1822.             $(window).on("message", function (e) {
  1823.                var data = e.originalEvent.data;
  1824.                if (data.match(/^chayns.customTab.getWindowMetrics:/i)) {
  1825.                   messageRecieved = true;
  1826.                   CallBack(JSON.parse(data.replace(/^chayns.customTab.getWindowMetrics:/i, "")));
  1827.                   $(window).off("message");
  1828.                }
  1829.             });
  1830.  
  1831.             callWebshadowFunction("getWindowMetrics", '');
  1832.             //window.top.postMessage("slitte:" + JSON.stringify(sendData), "*");
  1833.  
  1834.             setTimeout(function () {
  1835.                if (!messageRecieved) {
  1836.                   $(window).off("message");
  1837.                   CallBack({ AvailHeight: window.innerHeight, WindowScrollTop: $(window).scrollTop() });
  1838.                }
  1839.             }, 300);
  1840.          } else {
  1841.             CallBack({ AvailHeight: window.innerHeight, WindowScrollTop: $(window).scrollTop() });
  1842.          }
  1843.       }
  1844.    }
  1845.  
  1846.    this.SetWebshadowHeight = function (Offset) {
  1847.       if (window != window.top) {
  1848.          lastSetHeightOffset = typeof Offset === "number" ? Offset : 0;
  1849.          if (setHeightInterval == null) {
  1850.             callWebshadowFunction('forceHeight', 500);
  1851.             var lastHeight = 0;
  1852.             setHeightInterval = setInterval(function () {
  1853.                var newHeight = $("body").height() + lastSetHeightOffset;
  1854.                if (newHeight != lastHeight) {
  1855.                   lastHeight = newHeight;
  1856.                   callWebshadowFunction("height", newHeight);
  1857.                }
  1858.             }, 100);
  1859.          }
  1860.       }
  1861.    }
  1862.  
  1863.    function createDomElement(type, attributes, innerHTML) {
  1864.       var DOMElement = document.createElement(type);
  1865.       if (innerHTML)
  1866.          DOMElement.innerHTML = innerHTML;
  1867.  
  1868.       if (attributes && typeof attributes == "object") {
  1869.          for (key in attributes) {
  1870.             DOMElement.setAttribute(key, attributes[key]);
  1871.          }
  1872.       }
  1873.       return DOMElement;
  1874.    }
  1875.  
  1876.    function getparams() {
  1877.       var keyVal, params, url = window.location.href.split("?");
  1878.       if (url.length > 1) {
  1879.          params = url[1].split("&");
  1880.          if (params.length > 0) {
  1881.             that.UrlParameter = {};
  1882.             for (var i = 0; i < params.length; i++) {
  1883.                keyVal = params[i].split("=");
  1884.                if (keyVal.length > 1) {
  1885.                   that.UrlParameter[keyVal[0]] = decodeURI(keyVal[1]);
  1886.                }
  1887.             }
  1888.          }
  1889.       }
  1890.  
  1891.       if (that.UrlParameter) {
  1892.          if ("OS" in that.UrlParameter) {
  1893.             that.OS = that.UrlParameter.OS;
  1894.          } else if ("os" in that.UrlParameter) {
  1895.             that.OS = that.UrlParameter.os;
  1896.          }
  1897.          if ("AppVersion" in that.UrlParameter) {
  1898.             that.AppVersion = that.UrlParameter.AppVersion;
  1899.          } else if ("appversion" in that.UrlParameter) {
  1900.             that.AppVersion = that.UrlParameter.appversion;
  1901.          }
  1902.          if ("Colormode" in that.UrlParameter) {
  1903.             that.IsColorInverted = false;
  1904.          } else if ("colormode" in that.UrlParameter) {
  1905.             that.IsColorInverted = false;
  1906.          }
  1907.          if ("SiteID" in that.UrlParameter) {
  1908.             that.SiteID = that.UrlParameter.SiteID;
  1909.          } else if ("siteid" in that.UrlParameter) {
  1910.             that.SiteID = that.UrlParameter.siteid;
  1911.          }
  1912.          if ("LanguageID" in that.UrlParameter) {
  1913.             that.Language = languages[that.UrlParameter.LanguageID];
  1914.          } else if ("languageID" in that.UrlParameter) {
  1915.             that.Language = languages[that.UrlParameter.languageID];
  1916.          } else {
  1917.             var browserLanguage = navigator.language || navigator.userLanguage;
  1918.             if (typeof browserLanguage === "string") {
  1919.                if (browserLanguage.match(/de(-.{2})?/i)) {
  1920.                   that.Language = languages[1];
  1921.                } else if (browserLanguage.match(/en(-.{2})?/i)) {
  1922.                   that.Language = languages[2];
  1923.                } else if (browserLanguage.match(/nl(-.{2})?/i)) {
  1924.                   that.Language = languages[5];
  1925.                }
  1926.             }
  1927.          }
  1928.       }
  1929.  
  1930.       if (!that.OS && window != window.top) {//in iFrame
  1931.          that.OS = 'WEBSHADOW';
  1932.          loadedInWebshadow = true;
  1933.       }
  1934.  
  1935.       var androidMatch = navigator.userAgent.match(/Android/i),
  1936.             iosMatch = navigator.userAgent.match(/iPhone|iPod|iPad/i),
  1937.             wpMatch = navigator.userAgent.match(/Windows Phone/i),
  1938.             bbMatch = navigator.userAgent.match(/BlackBerry|BB10|RIM /);
  1939.       if (androidMatch != null && androidMatch.length > 0) {
  1940.          that.OS = that.OS || "ANDROID";
  1941.          that.DeviceOS = "ANDROID";
  1942.       } else if (iosMatch != null && iosMatch.length > 0) {
  1943.          that.OS = that.OS || "IOS";
  1944.          that.DeviceOS = "IOS";
  1945.       } else if (wpMatch != null && wpMatch.length > 0) {
  1946.          that.OS = that.OS || "WP8";
  1947.          that.DeviceOS = "WP8";
  1948.       } else if (bbMatch != null && bbMatch.length > 0) {
  1949.          that.OS = that.OS || "BLACKBERRY";
  1950.          that.DeviceOS = "BLACKBERRY";
  1951.       }
  1952.  
  1953.       that.OS = that.OS.toUpperCase();
  1954.  
  1955.       loadedInWebshadow = loadedInWebshadow || that.OS.indexOf("WEBSHADOW") == 0;
  1956.  
  1957.       var v = null;
  1958.       if (that.OS == "ANDROID") {
  1959.          v = navigator.userAgent.match(/Android [0-9\.]*/);
  1960.       } else if (that.OS == "WP8") {
  1961.          v = navigator.userAgent.match(/Windows Phone OS [0-9.]*/);
  1962.       } else if (that.OS == "IOS") {
  1963.          v = navigator.userAgent.match(/OS [0-9_]*/);
  1964.       } else if (that.OS == "BLACKBERRY") {
  1965.          v = navigator.userAgent.match(/Version\/[0-9.]*/);
  1966.       }
  1967.       if (v && v.length > 0) {
  1968.          that.OSVersion = v[0].replace(/[a-z \/]/ig, "");
  1969.       }
  1970.    }
  1971.  
  1972.    function preLoadImg() {
  1973.       var IMGs = [];
  1974.  
  1975.       for (var i = 0; i < 5; i++) {
  1976.          IMGs.push(new Image());
  1977.          switch (i) {
  1978.             case 0:
  1979.                IMGs[i].src = "//chayns1.tobit.com/SlitteRessource/Images/Chayns/stripe.gif";
  1980.                break;
  1981.             case 1:
  1982.                IMGs[i].src = "//chayns1.tobit.com/SlitteRessource/Images/Chayns/checkbox.png";
  1983.                break;
  1984.             case 2:
  1985.                IMGs[i].src = "//chayns1.tobit.com/SlitteRessource/Images/Chayns/checkbox_aktiv.png";
  1986.                break;
  1987.             case 3:
  1988.                if (that.OS == "ANDROID")
  1989.                   IMGs[i].src = "//chayns1.tobit.com/SlitteRessource/Images/Chayns/ListUp.png";
  1990.                break;
  1991.             case 4:
  1992.                if (that.OS == "ANDROID")
  1993.                   IMGs[i].src = "//chayns1.tobit.com/SlitteRessource/Images/Chayns/ListDown.png";
  1994.                break;
  1995.          }
  1996.  
  1997.          IMGs[i].onload = function () {
  1998.             try {
  1999.                this.remove();
  2000.             } catch (e) { }
  2001.          }
  2002.       }
  2003.    }
  2004.  
  2005.    function createHeadTags() {
  2006.       if (chaynsApiRoot.match(/wm0[1-4].tobit.com\//i) == null) {
  2007.          chaynsApiRoot = "//chayns1.tobit.com/SlitteRessource/API/";
  2008.       }
  2009.  
  2010.       var anticache = '?_=' + cacheVersion;
  2011.       if ((window.applicationCache || {}).status > 0) {//hat application cache eingestellt
  2012.          anticache = '';
  2013.       }
  2014.  
  2015.       document.head.appendChild(createDomElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1, user-scalable=no, minimum-scale=1, maximum-scale=1" }));
  2016.       document.head.appendChild(createDomElement("link", { href: chaynsApiRoot + "Styles/Mobile/V2/Global_" + cssVersion + ".css" + anticache, rel: "stylesheet", type: "text/css" }));
  2017.       document.head.appendChild(createDomElement("link", { href: "//netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css", rel: "stylesheet", type: "text/css" }));
  2018.  
  2019.       if (that.OS == "WP8" || that.DeviceOS == 'WP8') {
  2020.          document.head.appendChild(createDomElement("meta", { name: "msapplication-tap-highlight", content: "no" }));
  2021.       }
  2022.       if (that.OS == "ANDROID" || that.DeviceOS == 'ANDROID') {
  2023.          document.head.appendChild(createDomElement("link", { href: chaynsApiRoot + "Styles/Mobile/V2/Mobile_Android_V2_100.css" + anticache, rel: "stylesheet", type: "text/css" }));
  2024.       }
  2025.       if (that.OS == "IOS" || that.DeviceOS == 'IOS') {
  2026.          document.head.appendChild(createDomElement("link", { href: chaynsApiRoot + "Styles/Mobile/V2/Mobile_IOS_V2_100.css" + anticache, rel: "stylesheet", type: "text/css" }));
  2027.       }
  2028.       if (that.OS == 'WEBSHADOW') {
  2029.          document.head.appendChild(createDomElement("link", { href: chaynsApiRoot + "Styles/Mobile/V2/Webshadow_" + webshadowCssVersion + ".css" + anticache, rel: "stylesheet", type: "text/css" }));
  2030.       }
  2031.       if (that.OS.indexOf('WEBSHADOW') == 0) {
  2032.          document.head.appendChild(createDomElement("link", { href: chaynsApiRoot + "Styles/Mobile/V2/Global_RobotoFont.css" + anticache, rel: "stylesheet", type: "text/css" }));
  2033.       }
  2034.    }
  2035.  
  2036.    function listenPostMessage() {
  2037.       if (isJQload()) {
  2038.          $(window).on('message', function (e) {
  2039.             var namespace = 'chayns.customTab.',
  2040.                data = e.originalEvent.data;
  2041.  
  2042.             if (typeof data == 'string') {
  2043.                data = data.substr(namespace.length, data.length - namespace.length);
  2044.                var method = data.match(/[^:]*:/);
  2045.                if (method != null && method.length > 0) {
  2046.                   method = method[0];
  2047.  
  2048.                   var params = data.substr(method.length, data.length - method.length);
  2049.                   method = method.substr(0, method.length - 1);
  2050.                   switch (method) {
  2051.                      case 'getAppInfos':
  2052.                         try {
  2053.                            params = JSON.parse(params);
  2054.                            handleNewAppInfos(params);
  2055.                         } catch (e) {
  2056.                            handleNewAppInfos(null);
  2057.                         }
  2058.                         break;
  2059.                      default: break;
  2060.                   }
  2061.                }
  2062.             }
  2063.          });
  2064.       }
  2065.    }
  2066.  
  2067.    function setupChaynsCallQueue() {
  2068.       setInterval(function () {
  2069.          if (chaynsCallQueue.length > 0) {
  2070.             if ('chaynsCall' in window && typeof window.chaynsCall.href == 'function') {
  2071.                window.chaynsCall.href(chaynsCallQueue[0]);
  2072.             } else {
  2073.                window.location.href = chaynsCallQueue[0];
  2074.             }
  2075.             chaynsCallQueue.shift();
  2076.          }
  2077.       }, 100);
  2078.    }
  2079.  
  2080.    function chaynsCall(chaynsCallStr) {
  2081.       chaynsCallQueue.push(chaynsCallStr);
  2082.    }
  2083.  
  2084.    function getShortDayName(i) {
  2085.       return that.DayNames[i].substr(0, 2);
  2086.    }
  2087.  
  2088.    function getShortMonthName(i) {
  2089.       return that.MonthNames[i].substr(0, 3);
  2090.    }
  2091.  
  2092.    function checkAppVersion(versions) {
  2093.       if (that.AppVersion && (typeof versions == "object")) {
  2094.          for (var item in versions) {
  2095.             if (that.OS == item && that.AppVersion >= versions[item]) {
  2096.                return true;
  2097.             }
  2098.          }
  2099.       }
  2100.       return false;
  2101.    }
  2102.  
  2103.    function useChaynsCall() {
  2104.       if (that.AppVersion) {
  2105.          return checkAppVersion({ ANDROID: 2510, IOS: 2483, WP8: 2469, BLACKBERRY: 118 });
  2106.       }
  2107.       return false;
  2108.    }
  2109.  
  2110.    function isJQload() {
  2111.       if (typeof $ == "undefined") {
  2112.          return false;
  2113.       } else {
  2114.          return true;
  2115.       }
  2116.    }
  2117.  
  2118.    function isLangResLoaded() {
  2119.       return typeof LangRes !== "undefined";
  2120.    }
  2121.  
  2122.    function getLang(name, defaultString) {
  2123.       if (isLangResLoaded())
  2124.          return LangRes.Get(name) || defaultString;
  2125.       else
  2126.          return defaultString;
  2127.    }
  2128.  
  2129.    this.Trim = function (str) {
  2130.       if (typeof str == "string") {
  2131.          return str.replace(/^\s+|\s+$/g, "");
  2132.       } else {
  2133.          return str;
  2134.       }
  2135.    }
  2136.  
  2137.    this.IsGUID = function (GUID) {
  2138.       if (typeof GUID == "string") {
  2139.          GUID = that.Trim(GUID);
  2140.          return GUID.match(/^[0-9a-f]{4}([0-9a-f]{4}-){4}[0-9a-z]{12}$/i) != null;
  2141.       }
  2142.       return false;
  2143.    }
  2144.  
  2145.    this.IsMacAdress = function (MacAdress) {
  2146.       if (typeof MacAdress == "string") {
  2147.          MacAdress = that.Trim(MacAdress);
  2148.          return MacAdress.match(/^([0-9a-f]{2}[-:]){5}[0-9a-f]{2}$/i) != null;
  2149.       }
  2150.       return false;
  2151.    }
  2152.  
  2153.    this.IsBLEAdress = function (Adress) {
  2154.       return that.IsGUID(Adress) || that.IsMacAdress(Adress);
  2155.    }
  2156.  
  2157.    this.GetSchemeColor = function (saturation, baseColor) {
  2158.       var colorsObj = that.Colors || {};
  2159.       var baseColor = colorsObj.TextColorCustom || colorsObj.C100 || baseColor || '#6E6E6E';//Altes ojb, neues obj, parameter oder default
  2160.       if (typeof saturation == 'number' && saturation > 0 && saturation < 100) {
  2161.          saturation = saturation / 100;
  2162.          saturation = 1 - saturation;
  2163.          var rgb = baseColor.match(/[0-9A-F]{2}/gi),
  2164.             retColor = '#';
  2165.          for (var i = 0; i < rgb.length; i++) {
  2166.             var colorPart = parseInt(rgb[i], 16);
  2167.             var diff = 255 - colorPart;
  2168.             diff = Math.floor(diff * saturation);//abrunden, sonst minimal falsches Ergebnis
  2169.             colorPart += diff;
  2170.             retColor += colorPart.toString(16);
  2171.          }
  2172.          return retColor;
  2173.       }
  2174.       return baseColor;
  2175.    };
  2176.  
  2177.    function handleBLEResponse(data) {
  2178.       if (typeof bleResponseCallback == "function") {
  2179.          try {
  2180.             $('#BLEResponse').html(JSON.stringify(data)).show();
  2181.             var errorVal = { Code: data.ErrorCode };
  2182.             switch (data.ErrorCode) {
  2183.                case -1: errorVal.Message = "Platform doesn't support Bluetooth Low Energy"; break;
  2184.                case -2: errorVal.Message = 'The App is not authorized to use Bluetooth Low Energy'; break;
  2185.                case -3: errorVal.Message = 'Bluetooth is curently powered off'; break;
  2186.                case 1: errorVal.Message = 'Connection failed'; break;
  2187.                case 2: errorVal.Message = 'Read Device information failed'; break;
  2188.                case 3: errorVal.Message = 'Write to Device failed'; break;
  2189.                case 20: errorVal.Message = 'Read successful'; errorVal.Code = 0; break;
  2190.                case 30: errorVal.Message = 'Write successful'; errorVal.Code = 0; break;
  2191.                case 31: errorVal.Message = 'Must connect to Device before writing'; break;
  2192.             }
  2193.  
  2194.             var retData = {};
  2195.             retData.Error = errorVal;
  2196.  
  2197.             if (retData.Error.Code == 0) {
  2198.                retData.Address = data.Address;
  2199.                if (data.Connected != undefined) retData.Connected = !!data.Connected;//int to Bool
  2200.                if (data.Connectable != undefined) retData.Connectable = !!data.Connectable;//int to Bool
  2201.                if (data.IsInReach != undefined) retData.InReach = !!data.IsInReach;//int to Bool
  2202.                if (data.Name != undefined) retData.Name = data.Name;
  2203.                if (data.RSSI != undefined) retData.SignalStrength = data.RSSI;
  2204.  
  2205.                if (data.ProximityUUID != undefined) retData.GroupUID = data.ProximityUUID;
  2206.                if (data.SubNumber != undefined) retData.SubID = data.SubNumber;
  2207.                if (data.LocationID != undefined) retData.LocationID = data.LocationID;
  2208.                if (data.SiteID != undefined) retData.SiteID = data.SiteID;
  2209.                if (data.MeasurePower != undefined) retData.MeasurePower = data.MeasurePower;
  2210.                if (data.TXPower != undefined) retData.SendStrength = data.TXPower;
  2211.             }
  2212.             if (typeof bleResponseCallback == "function") {
  2213.                setTimeout(function () {
  2214.                   bleResponseCallback(retData);
  2215.                   bleResponseCallback = null;
  2216.                }, 0);//CallBack nicht direkt hier ausführen, da für diese Zeit die App "hängt" (böse wenn z.B. ein alert geöffnet wird)
  2217.             }
  2218.          } catch (e) {
  2219.  
  2220.          }
  2221.       }
  2222.    }
  2223.  
  2224.    function handleNewAppInfos(obj, ignoreCallBacks) {
  2225.       if (obj) {
  2226.          appInfos = obj;
  2227.          if ("AppInfo" in obj) {
  2228.             if (obj.AppInfo.Version != null) {
  2229.                that.AppVersion = obj.AppInfo.Version;
  2230.             }
  2231.             that.IsColorInverted = false;
  2232.             that.SiteID = obj.AppInfo.SiteID || "";
  2233.             if ("SchemeColors" in obj.AppInfo && !that.Colors) {//mehrfachausführung nicht nötig
  2234.                setSchemeColors(obj.AppInfo.SchemeColors);
  2235.             }
  2236.          }
  2237.          if ("Device" in obj) {
  2238.             if (typeof obj.Device.SystemName === "string") {
  2239.                that.OS = obj.Device.SystemName.toUpperCase();
  2240.                if (that.OS == "IPHONE OS") that.OS = "IOS";//iOS App gibt os falsch zurück
  2241.             }
  2242.             if (obj.Device.SystemVersion != null) {
  2243.                that.OSVersion = obj.Device.SystemVersion;
  2244.             }
  2245.             if (typeof obj.Device.LanguageID != "undefined") {
  2246.                that.Language = languages[obj.Device.LanguageID];
  2247.             }
  2248.             if (typeof obj.Device.Metrics != 'undefined' && (checkAppVersion({ 'ANDROID': 4039, 'WP8': 4025, 'IOS': 4049 }) || loadedInWebshadow)) {
  2249.                setMetrics(obj.Device.Metrics);
  2250.             }
  2251.          }
  2252.       }
  2253.       if (!ignoreCallBacks) {
  2254.          for (var i = 0; i < getAppInfosUserCallBacks.length; i++) {
  2255.             getAppInfosUserCallBacks[i](obj);
  2256.          }
  2257.          getAppInfosUserCallBacks = [];
  2258.       }
  2259.    }
  2260.  
  2261.    function setSchemeColors(colors) {
  2262.       var baseColor = colors.TextColorCustom || colors.C100;
  2263.       if (baseColor) {
  2264.          that.Colors = {
  2265.             Background: '#FFFFFF',
  2266.             C10: that.GetSchemeColor(10, baseColor),
  2267.             C20: that.GetSchemeColor(20, baseColor),
  2268.             C30: that.GetSchemeColor(30, baseColor),
  2269.             C40: that.GetSchemeColor(40, baseColor),
  2270.             C50: that.GetSchemeColor(50, baseColor),
  2271.             C60: that.GetSchemeColor(60, baseColor),
  2272.             C70: that.GetSchemeColor(70, baseColor),
  2273.             C80: that.GetSchemeColor(80, baseColor),
  2274.             C90: that.GetSchemeColor(90, baseColor),
  2275.             C100: baseColor,
  2276.             Text: '#545454'
  2277.          };
  2278.  
  2279.          createColorSchemeCSS();
  2280.       }
  2281.    }
  2282.  
  2283.    function setMetrics(deviceMetrics) {
  2284.       function px(value) {
  2285.          return value + 'px';
  2286.       };
  2287.       var d = deviceMetrics;
  2288.  
  2289.       document.body.style.fontSize = px(d.BodyText.Size);
  2290.       document.body.style.lineHeight = px(d.BodyText.LineHeight);
  2291.  
  2292.       chaynsCSSRules.push({ selector: 'html > body', rules: 'font-family: "' + d.FontFace + '"' });
  2293.       chaynsCSSRules.push({ selector: 'body .p:not(:last-child), body p:not(:last-child)', rules: 'margin-bottom: ' + px(d.BodyText.Margin.Bottom) });
  2294.       chaynsCSSRules.push({ selector: 'body .BoxWrapper', rules: 'margin-left: ' + px(d.ContentTileMargin.Left) + '; margin-right: ' + px(d.ContentTileMargin.Right) + '; margin-top: ' + px(d.ContentTileMargin.Top) + '; margin-bottom: ' + px(d.ContentTileMargin.Bottom) });
  2295.       chaynsCSSRules.push({ selector: 'body h1, body .h1', rules: 'line-height: ' + px(d.H1.LineHeight) + '; font-size: ' + px(d.H1.Size) + '; margin-bottom: ' + px(d.H1.Margin.Bottom) });
  2296.       chaynsCSSRules.push({ selector: 'body h2, body .h2', rules: 'line-height: ' + px(d.H2.LineHeight) + '; font-size: ' + px(d.H2.Size) + '; margin-bottom: ' + px(d.H2.Margin.Bottom) });
  2297.       chaynsCSSRules.push({ selector: 'body h3, body .h3', rules: 'line-height: ' + px(d.Title.LineHeight) + '; font-size: ' + px(d.Title.Size) + '; margin-bottom: ' + px(d.Title.Margin.Bottom) });
  2298.       chaynsCSSRules.push({ selector: 'body h4, body .h4', rules: 'line-height: ' + px(d.Subtitle.LineHeight) + '; font-size: ' + px(d.Subtitle.Size) + '; margin-bottom: ' + px(d.Subtitle.Margin.Bottom) });
  2299.       chaynsCSSRules.push({ selector: 'body #IntroBox, body .IntroBox', rules: 'margin-left: ' + px(d.TappIntroMargin.Left) + '; margin-right: ' + px(d.TappIntroMargin.Right) + '; margin-bottom: ' + px(d.TappIntroMargin.Bottom) + '; margin-top: ' + px(d.TappIntroMargin.Top) });
  2300.  
  2301.       writeChaynsCSS();
  2302.    }
  2303.  
  2304.    function handleDateSelectResponse(ts) {
  2305.       setTimeout(function () {
  2306.          if (dateSelectCallBackOptions != null) {
  2307.             var retval = null;
  2308.             if (ts != -1) {
  2309.                ts = ts * 1000;
  2310.                var retval = new Date(ts);
  2311.  
  2312.                var preselectDate = null;
  2313.                if (dateSelectCallBackOptions.Preselect == -1) {
  2314.                   preselectDate = new Date();
  2315.                } else {
  2316.                   preselectDate = new Date(dateSelectCallBackOptions.Preselect * 1000);
  2317.                }
  2318.                retval.setMilliseconds(preselectDate.getMilliseconds());
  2319.                retval.setSeconds(preselectDate.getSeconds());
  2320.                if (dateSelectCallBackOptions.SelectType == Chayns.DateSelectTypes.Time) {
  2321.                   retval.setDate(preselectDate.getDate());
  2322.                   retval.setMonth(preselectDate.getMonth());
  2323.                   retval.setFullYear(preselectDate.getFullYear());
  2324.                } else if (dateSelectCallBackOptions.SelectType == Chayns.DateSelectTypes.Date) {
  2325.                   retval.setMinutes(preselectDate.getMinutes());
  2326.                   retval.setHours(preselectDate.getHours());
  2327.                }
  2328.             }
  2329.             dateSelectCallBackOptions.Function(retval);
  2330.             dateSelectCallBackOptions = null;
  2331.          }
  2332.       }, 0);
  2333.    }
  2334.  
  2335.    function handleCreateQRCodeResponse(data) {
  2336.       if (typeof createQRCodeCallBack == 'function') {
  2337.          setTimeout(function () {
  2338.             createQRCodeCallBack("data:image/png;base64," + data);
  2339.          }, 0);
  2340.       }
  2341.    };
  2342.  
  2343.    function handleNewBeaconsResponse(beacons) {
  2344.       setTimeout(function () {
  2345.          if (beacons) {
  2346.             beaconList = beacons;
  2347.             beaconListCallBack(beaconList);
  2348.          } else {
  2349.             beaconListCallBack(null);
  2350.          }
  2351.       }, 0);
  2352.    }
  2353.  
  2354.    function handleLongLatCallBack(long, lat, speed) {
  2355.       if (singelGeoCoordinatesResponse) {
  2356.          setTimeout(Chayns.App.GetLongLat, 200);
  2357.       }
  2358.       if (typeof getLongLatCallBack == 'function') {
  2359.          getLongLatCallBack(long, lat, speed);
  2360.       }
  2361.    };
  2362.  
  2363.    function createColorSchemeCSS() {
  2364.       chaynsCSSRules.push({ selector: 'h1', rules: 'color: ' + that.GetSchemeColor(100) + ' !important;' });
  2365.       chaynsCSSRules.push({ selector: '.button, .button.gray:hover, .button.gray:focus, .button.gray:active', rules: 'background-color: ' + that.GetSchemeColor(100) + ' !important;' });
  2366.       chaynsCSSRules.push({ selector: 'h2, .h2, h4, .h4, .switch > div.inActive, .ChaynsAPIFoldOutTableContainer .FoldOutTableRowHeadline::after, a::before', rules: 'color: ' + that.GetSchemeColor(80) + ' !important;' });
  2367.       chaynsCSSRules.push({ selector: '.button:hover, .button:focus, .button:active, .switch > div.inActive', rules: 'background-color: ' + that.GetSchemeColor(80) + ' !important;' });
  2368.       chaynsCSSRules.push({ selector: '.choosebutton:not(.disabled):hover, .choosebutton:not(.disabled):active, .choosebutton:not(.disabled):focus', rules: 'background-color: ' + that.GetSchemeColor(30) + ' !important;' });
  2369.       chaynsCSSRules.push({ selector: '.ChaynsAPIFoldOutTableContainer .FoldOutTableMainHeadline, .FoldOutTableRow.WrappedEntries, .choosebutton, .switch, a:hover, a:focus, a:active', rules: 'background-color: ' + that.GetSchemeColor(20) + ' !important;' });
  2370.  
  2371.       for (var i = 10; i <= 100; i += 10) {
  2372.          var rule = 'background-color: ' + that.GetSchemeColor(i);
  2373.          if (i >= 70) {
  2374.             rule += '; color: #FFFFFF';
  2375.          }
  2376.          chaynsCSSRules.push({
  2377.             selector: '.colorScheme' + i + 'Percent',
  2378.             rules: rule
  2379.          });
  2380.       }
  2381.  
  2382.       writeChaynsCSS();
  2383.    }
  2384.  
  2385.    function writeChaynsCSS() {
  2386.       var existingElm = document.getElementById("ChaynsColorSchemeCSS");
  2387.       var styleElm = existingElm || document.createElement("style");
  2388.       if (existingElm) {
  2389.          styleElm.innerHTML = "";
  2390.       } else {
  2391.          styleElm.type = "text/css";
  2392.          styleElm.id = "ChaynsColorSchemeCSS";
  2393.       }
  2394.       for (var i = 0; i < chaynsCSSRules.length; i++) {
  2395.          if (chaynsCSSRules[i].rules) {
  2396.             styleElm.innerHTML += chaynsCSSRules[i].selector + '{' + chaynsCSSRules[i].rules + '}\n';
  2397.          }
  2398.       }
  2399.       if (!existingElm) {
  2400.          document.head.appendChild(styleElm);
  2401.       }
  2402.    }
  2403.  
  2404.    function callWebshadowFunction(functionName, params) {
  2405.       var namespace = "chayns.customTab.";
  2406.       params = params || '';
  2407.       try {
  2408.          window.parent.postMessage(namespace + functionName + ':' + params.toString(), '*');
  2409.       } catch (e) { }
  2410.    }
  2411.  
  2412.    //#endregion
  2413.  
  2414.    //#region Classes
  2415.  
  2416.    this.PopUpButton = function (Name, CallBack) {
  2417.       CallBack = CallBack || function () { };
  2418.  
  2419.       this.Name = Name;
  2420.       this.CallBack = CallBack;
  2421.    }
  2422.  
  2423.    this.SelectOption = function (Name, Value, Selected) {
  2424.       if (Name == undefined) Name = "";
  2425.       if (Value == undefined) Value = "";
  2426.       if (!Selected) Selected = false;
  2427.  
  2428.       this.Name = Name;
  2429.       this.Value = Value;
  2430.       this.Selected = Selected;
  2431.    }
  2432.  
  2433.    var FoldOutTableEntry = function (Parent, Headline, Description, Selected, InActive, Position) {
  2434.       if (Headline == undefined) Headline = "";
  2435.       if (Description == undefined) Description = "";
  2436.       if (!Selected) Selected = false;
  2437.       if (!InActive) InActive = false;
  2438.  
  2439.       //--private Fields
  2440.       var headline = Headline,
  2441.          description = Description,
  2442.          selected = Selected,
  2443.          inActive = InActive,
  2444.          collapsable = true,
  2445.          parent = Parent,
  2446.          element;
  2447.  
  2448.       //--public Methods
  2449.       this.Helper = {
  2450.          GetHeadline: function () {
  2451.             return headline;
  2452.          },
  2453.          SetHeadline: function (newHeadline) {
  2454.             newHeadline = (newHeadline == null ? "" : newHeadline);
  2455.             $($(element).find(".FoldOutTableRowHeadline")[0]).html(newHeadline);
  2456.             headline = newHeadline;
  2457.          },
  2458.          GetDescription: function () {
  2459.             return description;
  2460.          },
  2461.          SetDescription: function (newDescription) {
  2462.             newDescription = (newDescription == null ? "" : newDescription);
  2463.             $($(element).find(".FoldOutTableRowDescriptionContainer")[0]).children(".FoldOutTableRowDescription").html(newDescription);
  2464.             description = newDescription;
  2465.          },
  2466.          GetInActive: function () {
  2467.             return inActive;
  2468.          },
  2469.          SetInActive: function (newInActive) {
  2470.             newInActive = (newInActive == null ? false : newInActive);
  2471.             if (newInActive == inActive) {
  2472.                return;
  2473.             }
  2474.             if (newInActive) {
  2475.                $(element).find(".FoldOutTableRowHeadline").first().addClass("InActive");
  2476.             } else {
  2477.                $(element).find(".FoldOutTableRowHeadline").first().removeClass("InActive");
  2478.             }
  2479.             inActive = newInActive;
  2480.          },
  2481.          GetSelected: function () {
  2482.             return selected;
  2483.          },
  2484.          SetSelected: function (newSelected) {
  2485.             if (inActive || selected == newSelected || !collapsable) {
  2486.                return;
  2487.             }
  2488.             if (selected) {
  2489.                Chayns.AnimateHeight($(element).find(".FoldOutTableRowDescriptionContainer")[0], "0px");
  2490.                setTimeout(function () {
  2491.                   $(element).find(".FoldOutTableRowHeadline").first().removeClass("Active");
  2492.                }, 20);
  2493.                selected = newSelected;
  2494.             } else {
  2495.                if (!parent.Multiple) {
  2496.                   for (var i = 0; i < parent.Items.length; i++) {
  2497.                      if (parent.Items[i].Collapsable) {
  2498.                         if (parent.Items[i] != this && parent.Items[i].Selected) {
  2499.                            parent.Items[i].Selected = false;
  2500.                         }
  2501.                      }
  2502.                   }
  2503.                }
  2504.                var des = $(element).find(".FoldOutTableRowDescriptionContainer").first();
  2505.                that.AnimateHeight(des, (des.find(".FoldOutTableRowDescription").first().outerHeight() + parseInt($(des.find(".FoldOutTableRowDescription")[0]).css("margin-top").split('p')[0])) + "px", true);
  2506.                setTimeout(function () {
  2507.                   $(element).find(".FoldOutTableRowHeadline").first().addClass("Active");
  2508.                }, 20);
  2509.                selected = newSelected;
  2510.             }
  2511.          },
  2512.          GetCollapsable: function () {
  2513.             return collapsable;
  2514.          },
  2515.          SetCollapsable: function (value) {
  2516.             collapsable = typeof value == 'boolean' ? value : true;
  2517.  
  2518.             if (collapsable) {
  2519.                element.find('.FoldOutTableRowHeadline').first().removeClass('HideCursor');
  2520.             } else {
  2521.                element.find('.FoldOutTableRowHeadline').first().addClass('HideCursor');
  2522.             }
  2523.          }
  2524.       };
  2525.       this.Remove = function (OnlyElement) {
  2526.          OnlyElement = OnlyElement ? OnlyElement : false;
  2527.          if (OnlyElement) {
  2528.             $(element).remove();
  2529.          }
  2530.          else {
  2531.             for (var i = 0; i < parent.Items.length - 1; i++) {
  2532.                if (parent.Items[i] == this) {
  2533.                   var el = parent.Items[i + 1];
  2534.                   parent.Items[i + 1] = parent.Items[i];
  2535.                   parent.Items[i] = el;
  2536.                }
  2537.             }
  2538.             parent.Items.pop();
  2539.          }
  2540.       }
  2541.  
  2542.       //--public Fields
  2543.       this.Headline;
  2544.       this.Description;
  2545.       this.Selected;
  2546.       this.InActive;
  2547.  
  2548.       element = buildFoldOutTableEntry(this, parent);
  2549.       if (Position == null || Position >= parent.Items.length) {
  2550.          $(parent.Element).append(element);
  2551.       }
  2552.       else {
  2553.          $($(parent.Element).children()[Position + 1]).before(element);
  2554.       }
  2555.    }
  2556.  
  2557.    Object.defineProperties(FoldOutTableEntry.prototype, {
  2558.       "Headline": {
  2559.          get: function () { return this.Helper.GetHeadline(); },
  2560.          set: function (e) { this.Helper.SetHeadline(e); }
  2561.       },
  2562.       "Description": {
  2563.          get: function () { return this.Helper.GetDescription(); },
  2564.          set: function (e) { this.Helper.SetDescription(e); }
  2565.       },
  2566.       "Selected": {
  2567.          get: function () { return this.Helper.GetSelected(); },
  2568.          set: function (e) { this.Helper.SetSelected(e); }
  2569.       },
  2570.       "InActive": {
  2571.          get: function () { return this.Helper.GetInActive(); },
  2572.          set: function (e) { this.Helper.SetInActive(e); }
  2573.       },
  2574.       "Collapsable": {
  2575.          get: function () { return this.Helper.GetCollapsable(); },
  2576.          set: function (e) { this.Helper.SetCollapsable(e); }
  2577.       }
  2578.    });
  2579.  
  2580.    //#endregion
  2581.  
  2582. }).apply(Chayns);
  2583.  
  2584. //#region FixedCallBacks
  2585.  
  2586. function NFCCallback(PersonID) {
  2587.    Chayns.NfcCallBack(PersonID);
  2588. }
  2589.  
  2590. function facebookLogin(FBID) {
  2591.    location.reload();
  2592. }
  2593.  
  2594. function FBLoginChanged(FBID, FBName, FBToken) {
  2595.    Chayns.FBChangedCallBack(FBID, FBName, FBToken);
  2596. }
  2597.  
  2598. function ChaynsDocumentReady(appInfos) {
  2599.    Chayns.GetAppInfosCallBack(appInfos, true);
  2600. }
  2601.  
  2602. //#endregion
Add Comment
Please, Sign In to add comment