Popups, Welcome Bar, Optins and Lead Generation Plugin – Icegram - Version 1.10.2

Version Description

Update mobile Detect library

Download this release

Release Info

Developer Icegram
Plugin Icon 128x128 Popups, Welcome Bar, Optins and Lead Generation Plugin – Icegram
Version 1.10.2
Comparing to
See all releases

Code changes from version 1.10.1 to 1.10.2

assets/css/frontend.min.css CHANGED
@@ -1 +1 @@
1
- .ig_powered_by,.ig_powered_by a,a.ig_powered_by{color:#A8A8A8!important;text-decoration:none}.icegram .ig_button,.icegram input[type=submit],.icegram input[type=button]{border:none;box-sizing:border-box;box-shadow:none}.ig_message p{margin:0;padding:0;line-height:inherit;font-size:inherit}.icegram .ig_clear_fix:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.ig_form_response_text{margin:.5em auto;padding:.5em;text-align:center}.ig_form_container{display:none;position:relative;height:100%;z-index:10;padding:.7em 1em;text-align:left;line-height:1;box-sizing:border-box}.ig_form_container form{margin:0;padding:0;font-size:100%}.ig_form_container select,.ig_form_container textarea{height:2.25em}.ig_form_container input[type=checkbox]{height:1.25em!important}.ig_form_container .ig_form_header{width:98%;text-align:left}.ig_form_container .ig_form_footer{font-size:.8em;width:98%;clear:both;text-align:left}.ig_form_container .ig_form_els{margin:.3em 1% .3em 0}.ig_form_left .ig_form_container.layout_left{display:block;padding:1em .7em}.ig_form_right .ig_form_container.layout_right{display:block;padding:1em .7em;float:left}.ig_form_bottom .ig_form_container.layout_bottom{display:block;width:100%;height:auto}.ig_form_inline .ig_form_container.layout_inline{display:block;width:100%;padding:.5em;background-color:transparent!important;color:inherit!important}.ig_form_left .ig_form_container.layout_left .ig_form_els,.ig_form_right .ig_form_container.layout_right .ig_form_els{margin:.5em auto}.ig_form_bottom .ig_form_container.layout_bottom .ig_form_els,.ig_form_inline .ig_form_container.layout_inline .ig_form_els{display:inline-block;float:left}.ig_form_bottom .ig_form_container.layout_bottom .ig_full .ig_form_els,.ig_form_inline .ig_form_container.layout_inline .ig_full .ig_form_els{width:99%}.ig_form_bottom .ig_form_container.layout_bottom .ig_half .ig_form_els,.ig_form_inline .ig_form_container.layout_inline .ig_half .ig_form_els{width:49%}.ig_form_bottom .ig_form_container.layout_bottom .ig_third .ig_form_els,.ig_form_inline .ig_form_container.layout_inline .ig_third .ig_form_els{width:32%}.ig_form_bottom .ig_form_container.layout_bottom .ig_quater .ig_form_els,.ig_form_inline .ig_form_container.layout_inline .ig_quater .ig_form_els{width:24%}.ig_form_container .ig_form_els input{height:2.25em;line-height:2.2em}.ig_form_container .ig_form_els input,.ig_form_container .ig_form_els label,.ig_form_container .ig_form_els select,.ig_form_container .ig_form_els textarea{width:99%;font-size:1em;text-align:left;display:block;margin:0 auto;box-sizing:border-box}.ig_form_container .ig_form_els select,.ig_form_container .ig_form_els textarea{padding-left:.5em}.ig_form_container .ig_form_els textarea{padding-top:.5em}.ig_form_container .ig_form_els.ig_form_el_radio{height:2.25em!important;line-height:2.2em}.ig_form_container .ig_form_els.ig_form_el_radio input{width:auto!important;display:inline;margin:0 .3em;height:1em!important}.ig_form_bottom .ig_form_container.layout_bottom .ig_quater .ig_form_els.ig_form_el_radio,.ig_form_inline .ig_form_container.layout_inline .ig_quater .ig_form_els.ig_form_el_radio{display:inline}.ig_form_bottom .ig_form_container.layout_bottom .ig_quater .ig_form_els.ig_form_el_radio label,.ig_form_inline .ig_form_container.layout_inline .ig_quater .ig_form_els.ig_form_el_radio label{width:auto;display:inline}.ig_form_left .ig_form_container.layout_left .ig_button_label,.ig_form_right .ig_form_container.layout_right .ig_button_label{display:none}.ig_form_bottom .ig_form_container.layout_bottom .ig_button_label,.ig_form_inline .ig_form_container.layout_inline .ig_button_label{display:block;visibility:hidden;opacity:0}.ig_form_bottom .ig_form_container.layout_bottom .ig_button,.ig_form_bottom .ig_form_container.layout_bottom input[type=submit],.ig_form_bottom .ig_form_container.layout_bottom input[type=button],.ig_form_inline .ig_form_container.layout_inline .ig_button,.ig_form_inline .ig_form_container.layout_inline input[type=submit],.ig_form_inline .ig_form_container.layout_inline input[type=button],.ig_form_left .ig_form_container.layout_left .ig_button,.ig_form_left .ig_form_container.layout_left input[type=submit],.ig_form_left .ig_form_container.layout_left input[type=button],.ig_form_right .ig_form_container.layout_right .ig_button,.ig_form_right .ig_form_container.layout_right input[type=submit],.ig_form_right .ig_form_container.layout_right input[type=button]{width:99%;font-size:1em;float:none;margin:0 auto!important;text-align:center;display:block;-ms-transform:inherit;-webkit-transform:inherit;transform:inherit;opacity:1}.ig_form_inline.ig_form_style_1 .ig_form_container:before,.ig_form_inline.ig_form_style_4 .ig_form_container:before,.ig_form_style_0 .ig_form_container:before{display:none}.ig_form_container:before{content:'';padding:0;margin:0;position:absolute;box-sizing:content-box}.ig_form_style_0 .ig_form_container .ig_form_els input{height:2.25em;line-height:2.2em;padding:inherit;padding-left:.5em}.ig_form_style_0 .ig_form_container .ig_form_els .ig_button,.ig_form_style_0 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_0 .ig_form_container .ig_form_els .ig_button:hover{height:2.25em;line-height:2.2em;padding:inherit}.ig_form_style_1 .ig_form_container:before{border-width:0;border-style:solid;border-color:#000!important;opacity:.3;top:0}.ig_form_left.ig_form_style_1 .ig_form_container:before{right:0;height:inherit;border-left-width:.22em}.ig_form_right.ig_form_style_1 .ig_form_container:before{left:0;height:inherit;border-left-width:.22em}.ig_form_bottom.ig_form_style_1 .ig_form_container:before{left:0;width:100%;border-top-width:.22em}.ig_form_style_1 .ig_form_container .ig_form_els input:not(.ig_button),.ig_form_style_5 .ig_form_container .ig_form_els input:not(.ig_button),.ig_form_style_6 .ig_form_container .ig_form_els input:not(.ig_button){border:1px solid #ccc}.ig_form_style_1 .ig_form_container .ig_form_els input,.ig_form_style_5 .ig_form_container .ig_form_els input,.ig_form_style_6 .ig_form_container .ig_form_els input{height:2.25em;line-height:2.2em;border-radius:.2em;box-shadow:none;padding:inherit;padding-left:.5em}.ig_form_style_1 .ig_form_container .ig_form_els input:focus:not(.ig_button),.ig_form_style_1 .ig_form_container .ig_form_els input:hover:not(.ig_button),.ig_form_style_5 .ig_form_container .ig_form_els input:focus:not(.ig_button),.ig_form_style_5 .ig_form_container .ig_form_els input:hover:not(.ig_button),.ig_form_style_6 .ig_form_container .ig_form_els input:focus:not(.ig_button),.ig_form_style_6 .ig_form_container .ig_form_els input:hover:not(.ig_button){border-color:#999}.ig_form_style_1 .ig_form_container .ig_form_els input:focus,.ig_form_style_1 .ig_form_container .ig_form_els input:hover,.ig_form_style_5 .ig_form_container .ig_form_els input:focus,.ig_form_style_5 .ig_form_container .ig_form_els input:hover,.ig_form_style_6 .ig_form_container .ig_form_els input:focus,.ig_form_style_6 .ig_form_container .ig_form_els input:hover{height:2.25em;line-height:2.2em;padding:inherit;padding-left:.5em}.ig_form_style_1 .ig_form_container .ig_form_els .ig_button,.ig_form_style_1 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_1 .ig_form_container .ig_form_els .ig_button:hover,.ig_form_style_5 .ig_form_container .ig_form_els .ig_button,.ig_form_style_5 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_5 .ig_form_container .ig_form_els .ig_button:hover,.ig_form_style_6 .ig_form_container .ig_form_els .ig_button,.ig_form_style_6 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_6 .ig_form_container .ig_form_els .ig_button:hover{height:2.25em;line-height:2.2em;padding:inherit}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els{margin-right:0;margin-left:0}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els .ig_button,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els .ig_button,.ig_form_left.ig_form_style_2 .ig_form_container.layout_left .ig_form_els .ig_button,.ig_form_right.ig_form_style_2 .ig_form_container.layout_right .ig_form_els .ig_button{padding:inherit}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els.ig_form_els_first label,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els.ig_form_els_first label,.ig_form_left.ig_form_style_2 .ig_form_container.layout_left .ig_form_els input,.ig_form_left.ig_form_style_2 .ig_form_container.layout_left .ig_form_els label,.ig_form_right.ig_form_style_2 .ig_form_container.layout_right .ig_form_els input,.ig_form_right.ig_form_style_2 .ig_form_container.layout_right .ig_form_els label{padding-left:1em}.ig_form_left.ig_form_style_2 .ig_form_container.layout_left .ig_form_els .ig_button,.ig_form_left.ig_form_style_2 .ig_form_container.layout_left .ig_form_els input,.ig_form_right.ig_form_style_2 .ig_form_container.layout_right .ig_form_els .ig_button,.ig_form_right.ig_form_style_2 .ig_form_container.layout_right .ig_form_els input{height:2.25em;line-height:2.2em;border-radius:2em}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els .ig_button,.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els input,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els .ig_button,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els input{height:2.25em;line-height:2.2em;width:100%;border-width:2px 0 2px 2px}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els.ig_form_els_first input,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els.ig_form_els_first input{border-radius:2em 0 0 2em;padding-left:1em}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els.ig_form_els_last input,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els.ig_form_els_last input{border-radius:0 2em 2em 0}.ig_form_style_3 .ig_form_container .ig_form_els input:not(.ig_button){border:1px solid rgba(255,255,255,.3)}.ig_form_style_3 .ig_form_container .ig_form_els input{height:2.25em;line-height:2.2em;box-shadow:none;padding:inherit;padding-left:.5em;background-color:rgba(0,0,0,.3)}.ig_form_style_3 .ig_form_container .ig_form_els input:focus:not(.ig_button),.ig_form_style_3 .ig_form_container .ig_form_els input:hover:not(.ig_button){border-color:rgba(255,255,255,.6)}.ig_form_style_3 .ig_form_container .ig_form_els input:focus,.ig_form_style_3 .ig_form_container .ig_form_els input:hover{height:2.25em;line-height:2.2em;padding:inherit;padding-left:.5em}.ig_form_style_3 .ig_form_container .ig_form_els .ig_button,.ig_form_style_3 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_3 .ig_form_container .ig_form_els .ig_button:hover{height:2.25em;line-height:2.2em;padding:inherit}.ig_form_style_3 .ig_form_container .ig_form_els ::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.ig_form_style_3 .ig_form_container .ig_form_els :-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.ig_form_style_3 .ig_form_container .ig_form_els ::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.ig_form_style_3 .ig_form_container .ig_form_els :-ms-input-placeholder{color:rgba(255,255,255,.5)}.ig_form_bottom.ig_form_style_4 .ig_content{margin-bottom:1.3em}.ig_form_style_4 .ig_form_container:before{border-style:solid;top:-1em;left:-1em;width:100%;height:100%;border-width:1em;z-index:-1;box-shadow:0 0 15px rgba(0,0,0,.7)}.ig_form_right.ig_form_style_4 .ig_form_container:before{left:inherit;right:-1em}.ig_form_style_4 .ig_form_container .ig_form_els input{height:2.25em;line-height:2.2em;padding:inherit;padding-left:.5em}.ig_form_style_4 .ig_form_container .ig_form_els .ig_button,.ig_form_style_4 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_4 .ig_form_container .ig_form_els .ig_button:hover{height:2.25em;line-height:2.2em;padding:inherit}.ig_form_bottom.ig_form_style_5 .ig_form_container.layout_bottom .ig_form_els_first,.ig_form_inline.ig_form_style_5 .ig_form_container.layout_inline .ig_form_els_first{width:68%}.ig_form_bottom.ig_form_style_5 .ig_form_container.layout_bottom .ig_form_els_last,.ig_form_inline.ig_form_style_5 .ig_form_container.layout_inline .ig_form_els_last{width:30%}.ig_form_style_6 .ig_form_container.layout_bottom .ig_full .ig_form_els,.ig_form_style_6 .ig_form_container.layout_bottom .ig_half .ig_form_els,.ig_form_style_6 .ig_form_container.layout_bottom .ig_quater .ig_form_els,.ig_form_style_6 .ig_form_container.layout_bottom .ig_third .ig_form_els,.ig_form_style_6 .ig_form_container.layout_inline .ig_full .ig_form_els,.ig_form_style_6 .ig_form_container.layout_inline .ig_half .ig_form_els,.ig_form_style_6 .ig_form_container.layout_inline .ig_quater .ig_form_els,.ig_form_style_6 .ig_form_container.layout_inline .ig_third .ig_form_els{width:99%;margin:.5em auto 0}.ig_anim_appear_in{-webkit-animation:IgFadeIn .9s;animation:IgFadeIn .9s;visibility:visible}@-webkit-keyframes IgFadeIn{0%{opacity:0}50%{opacity:.5}100%{opacity:1}}@keyframes IgFadeIn{0%{opacity:0}50%{opacity:.5}100%{opacity:1}}.ig_anim_appear_out{-webkit-animation:IgFadeOut .9s;animation:IgFadeOut .9s}@-webkit-keyframes IgFadeOut{0%{opacity:1}99.5%{opacity:.5}100%{opacity:1}}@keyframes IgFadeOut{0%{opacity:1}99.5%{opacity:.5}100%{opacity:1}}.ig_left.ig_anim_slide_in{animation-name:IgSlideInLeft;-moz-animation-name:IgSlideInLeft;-webkit-animation-name:IgSlideInLeft;animation-duration:.5s;-moz-animation-duration:.5s;-webkit-animation-duration:.5s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease}@-webkit-keyframes IgSlideInLeft{0%{-webkit-transform:translate3d(-100%,0,0)}100%{-webkit-transform:none}}@keyframes IgSlideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{-webkit-transform:none;transform:none}}.ig_left.ig_anim_slide_out{animation-name:IgFadeOutLeft;-moz-animation-name:IgFadeOutLeft;-webkit-animation-name:IgFadeOutLeft;animation-duration:.9s;-moz-animation-duration:.9s;-webkit-animation-duration:.9s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes IgFadeOutLeft{0%{opacity:1;-webkit-transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:translate3d(-100%,0,0)}}@keyframes IgFadeOutLeft{0%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.ig_right.ig_anim_slide_in{animation-name:IgSlideInRight;-moz-animation-name:IgSlideInRight;-webkit-animation-name:IgSlideInRight;animation-duration:.5s;-moz-animation-duration:.5s;-webkit-animation-duration:.5s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease}@-webkit-keyframes IgSlideInRight{0%{-webkit-transform:translate3d(100%,0,0)}100%{-webkit-transform:none}}@keyframes IgSlideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{-webkit-transform:none;transform:none}}.ig_right.ig_anim_slide_out{animation-name:IgFadeOutRight;-moz-animation-name:IgFadeOutRight;-webkit-animation-name:IgFadeOutRight;animation-duration:.9s;-moz-animation-duration:.9s;-webkit-animation-duration:.9s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes IgFadeOutRight{0%{opacity:1;-webkit-transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:translate3d(100%,0,0)}}@keyframes IgFadeOutRight{0%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.ig_bottom .ig_anim_slide_in,.ig_bottom.ig_anim_slide_in{animation-name:IgSlideInUp;-moz-animation-name:IgSlideInUp;-webkit-animation-name:IgSlideInUp;animation-duration:.5s;-moz-animation-duration:.5s;-webkit-animation-duration:.5s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease}@-webkit-keyframes IgSlideInUp{0%{-webkit-transform:translate3d(0,100%,0)}100%{-webkit-transform:none}}@keyframes IgSlideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{-webkit-transform:none;transform:none}}.ig_bottom .ig_anim_slide_out,.ig_bottom.ig_anim_slide_out{animation-name:IgFadeOutDown;-moz-animation-name:IgFadeOutDown;-webkit-animation-name:IgFadeOutDown;animation-duration:.9s;-moz-animation-duration:.9s;-webkit-animation-duration:.9s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes IgFadeOutDown{0%{opacity:1;-webkit-transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:translate3d(0,100%,0)}}@keyframes IgFadeOutDown{0%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.ig_anim_slide_in,.ig_top .ig_anim_slide_in,.ig_top.ig_anim_slide_in{animation-name:IgSlideInDown;-moz-animation-name:IgSlideInDown;-webkit-animation-name:IgSlideInDown;animation-duration:.5s;-moz-animation-duration:.5s;-webkit-animation-duration:.5s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease}@-webkit-keyframes IgSlideInDown{0%{-webkit-transform:translate3d(0,-100%,0)}100%{-webkit-transform:none}}@keyframes IgSlideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{-webkit-transform:none;transform:none}}.ig_anim_slide_out,.ig_top .ig_anim_slide_out,.ig_top.ig_anim_slide_out{animation-name:IgFadeOutUp;-moz-animation-name:IgFadeOutUp;-webkit-animation-name:IgFadeOutUp;animation-duration:.9s;-moz-animation-duration:.9s;-webkit-animation-duration:.9s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes IgFadeOutUp{0%{opacity:1;-webkit-transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:translate3d(0,-100%,0)}}@keyframes IgFadeOutUp{0%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}
1
+ .ig_powered_by,.ig_powered_by a,a.ig_powered_by{color:#A8A8A8!important;text-decoration:none}.ig_cta_overlay{width:100%;height:100%;top:0;left:0;background:#E6E6E6;z-index:1000000;position:fixed;opacity:.5}.ig_cta_spinner{background:url(../images/spinner-2x.gif) center no-repeat no-repeat;height:100%}.icegram .ig_button,.icegram input[type=submit],.icegram input[type=button]{border:none;box-sizing:border-box;box-shadow:none}.ig_message p{margin:0;padding:0;line-height:inherit;font-size:inherit}.icegram .ig_clear_fix:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.ig_form_response_text{margin:.5em auto;padding:.5em;text-align:center}.ig_form_container{display:none;position:relative;height:100%;z-index:10;padding:.7em 1em;text-align:left;line-height:1;box-sizing:border-box}.ig_form_container form{margin:0;padding:0;font-size:100%}.ig_form_container select,.ig_form_container textarea{height:2.25em}.ig_form_container input[type=checkbox]{height:1.25em!important}.ig_form_container .ig_form_header{width:98%;text-align:left}.ig_form_container .ig_form_footer{font-size:.8em;width:98%;clear:both;text-align:left}.ig_form_container .ig_form_els{margin:.3em 1% .3em 0}.ig_form_left .ig_form_container.layout_left{display:block;padding:1em .7em}.ig_form_right .ig_form_container.layout_right{display:block;padding:1em .7em;float:left}.ig_form_bottom .ig_form_container.layout_bottom{display:block;width:100%;height:auto}.ig_form_inline .ig_form_container.layout_inline{display:block;width:100%;padding:.5em;background-color:transparent!important;color:inherit!important}.ig_form_left .ig_form_container.layout_left .ig_form_els,.ig_form_right .ig_form_container.layout_right .ig_form_els{margin:.5em auto}.ig_form_bottom .ig_form_container.layout_bottom .ig_form_els,.ig_form_inline .ig_form_container.layout_inline .ig_form_els{display:inline-block;float:left}.ig_form_bottom .ig_form_container.layout_bottom .ig_full .ig_form_els,.ig_form_inline .ig_form_container.layout_inline .ig_full .ig_form_els{width:99%}.ig_form_bottom .ig_form_container.layout_bottom .ig_half .ig_form_els,.ig_form_inline .ig_form_container.layout_inline .ig_half .ig_form_els{width:49%}.ig_form_bottom .ig_form_container.layout_bottom .ig_third .ig_form_els,.ig_form_inline .ig_form_container.layout_inline .ig_third .ig_form_els{width:32%}.ig_form_bottom .ig_form_container.layout_bottom .ig_quater .ig_form_els,.ig_form_inline .ig_form_container.layout_inline .ig_quater .ig_form_els{width:24%}.ig_form_container .ig_form_els input{height:2.25em;line-height:2.2em}.ig_form_container .ig_form_els input,.ig_form_container .ig_form_els label,.ig_form_container .ig_form_els select,.ig_form_container .ig_form_els textarea{width:99%;font-size:1em;text-align:left;display:block;margin:0 auto;box-sizing:border-box}.ig_form_container .ig_form_els select,.ig_form_container .ig_form_els textarea{padding-left:.5em}.ig_form_container .ig_form_els textarea{padding-top:.5em}.ig_form_container .ig_form_els.ig_form_el_radio{height:2.25em!important;line-height:2.2em}.ig_form_container .ig_form_els.ig_form_el_radio input{width:auto!important;display:inline;margin:0 .3em;height:1em!important}.ig_form_bottom .ig_form_container.layout_bottom .ig_quater .ig_form_els.ig_form_el_radio,.ig_form_inline .ig_form_container.layout_inline .ig_quater .ig_form_els.ig_form_el_radio{display:inline}.ig_form_bottom .ig_form_container.layout_bottom .ig_quater .ig_form_els.ig_form_el_radio label,.ig_form_inline .ig_form_container.layout_inline .ig_quater .ig_form_els.ig_form_el_radio label{width:auto;display:inline}.ig_form_left .ig_form_container.layout_left .ig_button_label,.ig_form_right .ig_form_container.layout_right .ig_button_label{display:none}.ig_form_bottom .ig_form_container.layout_bottom .ig_button_label,.ig_form_inline .ig_form_container.layout_inline .ig_button_label{display:block;visibility:hidden;opacity:0}.ig_form_bottom .ig_form_container.layout_bottom .ig_button,.ig_form_bottom .ig_form_container.layout_bottom input[type=submit],.ig_form_bottom .ig_form_container.layout_bottom input[type=button],.ig_form_inline .ig_form_container.layout_inline .ig_button,.ig_form_inline .ig_form_container.layout_inline input[type=submit],.ig_form_inline .ig_form_container.layout_inline input[type=button],.ig_form_left .ig_form_container.layout_left .ig_button,.ig_form_left .ig_form_container.layout_left input[type=submit],.ig_form_left .ig_form_container.layout_left input[type=button],.ig_form_right .ig_form_container.layout_right .ig_button,.ig_form_right .ig_form_container.layout_right input[type=submit],.ig_form_right .ig_form_container.layout_right input[type=button]{width:99%;font-size:1em;float:none;margin:0 auto!important;text-align:center;display:block;-ms-transform:inherit;-webkit-transform:inherit;transform:inherit;opacity:1}.ig_form_inline.ig_form_style_1 .ig_form_container:before,.ig_form_inline.ig_form_style_4 .ig_form_container:before,.ig_form_style_0 .ig_form_container:before{display:none}.ig_form_container:before{content:'';padding:0;margin:0;position:absolute;box-sizing:content-box}.ig_form_style_0 .ig_form_container .ig_form_els input{height:2.25em;line-height:2.2em;padding:inherit;padding-left:.5em}.ig_form_style_0 .ig_form_container .ig_form_els .ig_button,.ig_form_style_0 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_0 .ig_form_container .ig_form_els .ig_button:hover{height:2.25em;line-height:2.2em;padding:inherit}.ig_form_style_1 .ig_form_container:before{border-width:0;border-style:solid;border-color:#000!important;opacity:.3;top:0}.ig_form_left.ig_form_style_1 .ig_form_container:before{right:0;height:inherit;border-left-width:.22em}.ig_form_right.ig_form_style_1 .ig_form_container:before{left:0;height:inherit;border-left-width:.22em}.ig_form_bottom.ig_form_style_1 .ig_form_container:before{left:0;width:100%;border-top-width:.22em}.ig_form_style_1 .ig_form_container .ig_form_els input:not(.ig_button),.ig_form_style_5 .ig_form_container .ig_form_els input:not(.ig_button),.ig_form_style_6 .ig_form_container .ig_form_els input:not(.ig_button){border:1px solid #ccc}.ig_form_style_1 .ig_form_container .ig_form_els input,.ig_form_style_5 .ig_form_container .ig_form_els input,.ig_form_style_6 .ig_form_container .ig_form_els input{height:2.25em;line-height:2.2em;border-radius:.2em;box-shadow:none;padding:inherit;padding-left:.5em}.ig_form_style_1 .ig_form_container .ig_form_els input:focus:not(.ig_button),.ig_form_style_1 .ig_form_container .ig_form_els input:hover:not(.ig_button),.ig_form_style_5 .ig_form_container .ig_form_els input:focus:not(.ig_button),.ig_form_style_5 .ig_form_container .ig_form_els input:hover:not(.ig_button),.ig_form_style_6 .ig_form_container .ig_form_els input:focus:not(.ig_button),.ig_form_style_6 .ig_form_container .ig_form_els input:hover:not(.ig_button){border-color:#999}.ig_form_style_1 .ig_form_container .ig_form_els input:focus,.ig_form_style_1 .ig_form_container .ig_form_els input:hover,.ig_form_style_5 .ig_form_container .ig_form_els input:focus,.ig_form_style_5 .ig_form_container .ig_form_els input:hover,.ig_form_style_6 .ig_form_container .ig_form_els input:focus,.ig_form_style_6 .ig_form_container .ig_form_els input:hover{height:2.25em;line-height:2.2em;padding:inherit;padding-left:.5em}.ig_form_style_1 .ig_form_container .ig_form_els .ig_button,.ig_form_style_1 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_1 .ig_form_container .ig_form_els .ig_button:hover,.ig_form_style_5 .ig_form_container .ig_form_els .ig_button,.ig_form_style_5 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_5 .ig_form_container .ig_form_els .ig_button:hover,.ig_form_style_6 .ig_form_container .ig_form_els .ig_button,.ig_form_style_6 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_6 .ig_form_container .ig_form_els .ig_button:hover{height:2.25em;line-height:2.2em;padding:inherit}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els{margin-right:0;margin-left:0}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els .ig_button,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els .ig_button,.ig_form_left.ig_form_style_2 .ig_form_container.layout_left .ig_form_els .ig_button,.ig_form_right.ig_form_style_2 .ig_form_container.layout_right .ig_form_els .ig_button{padding:inherit}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els.ig_form_els_first label,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els.ig_form_els_first label,.ig_form_left.ig_form_style_2 .ig_form_container.layout_left .ig_form_els input,.ig_form_left.ig_form_style_2 .ig_form_container.layout_left .ig_form_els label,.ig_form_right.ig_form_style_2 .ig_form_container.layout_right .ig_form_els input,.ig_form_right.ig_form_style_2 .ig_form_container.layout_right .ig_form_els label{padding-left:1em}.ig_form_left.ig_form_style_2 .ig_form_container.layout_left .ig_form_els .ig_button,.ig_form_left.ig_form_style_2 .ig_form_container.layout_left .ig_form_els input,.ig_form_right.ig_form_style_2 .ig_form_container.layout_right .ig_form_els .ig_button,.ig_form_right.ig_form_style_2 .ig_form_container.layout_right .ig_form_els input{height:2.25em;line-height:2.2em;border-radius:2em}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els .ig_button,.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els input,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els .ig_button,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els input{height:2.25em;line-height:2.2em;width:100%;border-width:2px 0 2px 2px}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els.ig_form_els_first input,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els.ig_form_els_first input{border-radius:2em 0 0 2em;padding-left:1em}.ig_form_bottom.ig_form_style_2 .ig_form_container.layout_bottom .ig_form_els.ig_form_els_last input,.ig_form_inline.ig_form_style_2 .ig_form_container.layout_inline .ig_form_els.ig_form_els_last input{border-radius:0 2em 2em 0}.ig_form_style_3 .ig_form_container .ig_form_els input:not(.ig_button){border:1px solid rgba(255,255,255,.3)}.ig_form_style_3 .ig_form_container .ig_form_els input{height:2.25em;line-height:2.2em;box-shadow:none;padding:inherit;padding-left:.5em;background-color:rgba(0,0,0,.3)}.ig_form_style_3 .ig_form_container .ig_form_els input:focus:not(.ig_button),.ig_form_style_3 .ig_form_container .ig_form_els input:hover:not(.ig_button){border-color:rgba(255,255,255,.6)}.ig_form_style_3 .ig_form_container .ig_form_els input:focus,.ig_form_style_3 .ig_form_container .ig_form_els input:hover{height:2.25em;line-height:2.2em;padding:inherit;padding-left:.5em}.ig_form_style_3 .ig_form_container .ig_form_els .ig_button,.ig_form_style_3 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_3 .ig_form_container .ig_form_els .ig_button:hover{height:2.25em;line-height:2.2em;padding:inherit}.ig_form_style_3 .ig_form_container .ig_form_els ::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.ig_form_style_3 .ig_form_container .ig_form_els :-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.ig_form_style_3 .ig_form_container .ig_form_els ::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.ig_form_style_3 .ig_form_container .ig_form_els :-ms-input-placeholder{color:rgba(255,255,255,.5)}.ig_form_bottom.ig_form_style_4 .ig_content{margin-bottom:1.3em}.ig_form_style_4 .ig_form_container:before{border-style:solid;top:-1em;left:-1em;width:100%;height:100%;border-width:1em;z-index:-1;box-shadow:0 0 15px rgba(0,0,0,.7)}.ig_form_right.ig_form_style_4 .ig_form_container:before{left:inherit;right:-1em}.ig_form_style_4 .ig_form_container .ig_form_els input{height:2.25em;line-height:2.2em;padding:inherit;padding-left:.5em}.ig_form_style_4 .ig_form_container .ig_form_els .ig_button,.ig_form_style_4 .ig_form_container .ig_form_els .ig_button:focus,.ig_form_style_4 .ig_form_container .ig_form_els .ig_button:hover{height:2.25em;line-height:2.2em;padding:inherit}.ig_form_bottom.ig_form_style_5 .ig_form_container.layout_bottom .ig_form_els_first,.ig_form_inline.ig_form_style_5 .ig_form_container.layout_inline .ig_form_els_first{width:68%}.ig_form_bottom.ig_form_style_5 .ig_form_container.layout_bottom .ig_form_els_last,.ig_form_inline.ig_form_style_5 .ig_form_container.layout_inline .ig_form_els_last{width:30%}.ig_form_style_6 .ig_form_container.layout_bottom .ig_full .ig_form_els,.ig_form_style_6 .ig_form_container.layout_bottom .ig_half .ig_form_els,.ig_form_style_6 .ig_form_container.layout_bottom .ig_quater .ig_form_els,.ig_form_style_6 .ig_form_container.layout_bottom .ig_third .ig_form_els,.ig_form_style_6 .ig_form_container.layout_inline .ig_full .ig_form_els,.ig_form_style_6 .ig_form_container.layout_inline .ig_half .ig_form_els,.ig_form_style_6 .ig_form_container.layout_inline .ig_quater .ig_form_els,.ig_form_style_6 .ig_form_container.layout_inline .ig_third .ig_form_els{width:99%;margin:.5em auto 0}.ig_anim_appear_in{-webkit-animation:IgFadeIn .9s;animation:IgFadeIn .9s;visibility:visible}@-webkit-keyframes IgFadeIn{0%{opacity:0}50%{opacity:.5}100%{opacity:1}}@keyframes IgFadeIn{0%{opacity:0}50%{opacity:.5}100%{opacity:1}}.ig_anim_appear_out{-webkit-animation:IgFadeOut .9s;animation:IgFadeOut .9s}@-webkit-keyframes IgFadeOut{0%{opacity:1}99.5%{opacity:.5}100%{opacity:1}}@keyframes IgFadeOut{0%{opacity:1}99.5%{opacity:.5}100%{opacity:1}}.ig_left.ig_anim_slide_in{animation-name:IgSlideInLeft;-moz-animation-name:IgSlideInLeft;-webkit-animation-name:IgSlideInLeft;animation-duration:.5s;-moz-animation-duration:.5s;-webkit-animation-duration:.5s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease}@-webkit-keyframes IgSlideInLeft{0%{-webkit-transform:translate3d(-100%,0,0)}100%{-webkit-transform:none}}@keyframes IgSlideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{-webkit-transform:none;transform:none}}.ig_left.ig_anim_slide_out{animation-name:IgFadeOutLeft;-moz-animation-name:IgFadeOutLeft;-webkit-animation-name:IgFadeOutLeft;animation-duration:.9s;-moz-animation-duration:.9s;-webkit-animation-duration:.9s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes IgFadeOutLeft{0%{opacity:1;-webkit-transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:translate3d(-100%,0,0)}}@keyframes IgFadeOutLeft{0%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.ig_right.ig_anim_slide_in{animation-name:IgSlideInRight;-moz-animation-name:IgSlideInRight;-webkit-animation-name:IgSlideInRight;animation-duration:.5s;-moz-animation-duration:.5s;-webkit-animation-duration:.5s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease}@-webkit-keyframes IgSlideInRight{0%{-webkit-transform:translate3d(100%,0,0)}100%{-webkit-transform:none}}@keyframes IgSlideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{-webkit-transform:none;transform:none}}.ig_right.ig_anim_slide_out{animation-name:IgFadeOutRight;-moz-animation-name:IgFadeOutRight;-webkit-animation-name:IgFadeOutRight;animation-duration:.9s;-moz-animation-duration:.9s;-webkit-animation-duration:.9s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes IgFadeOutRight{0%{opacity:1;-webkit-transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:translate3d(100%,0,0)}}@keyframes IgFadeOutRight{0%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.ig_bottom .ig_anim_slide_in,.ig_bottom.ig_anim_slide_in{animation-name:IgSlideInUp;-moz-animation-name:IgSlideInUp;-webkit-animation-name:IgSlideInUp;animation-duration:.5s;-moz-animation-duration:.5s;-webkit-animation-duration:.5s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease}@-webkit-keyframes IgSlideInUp{0%{-webkit-transform:translate3d(0,100%,0)}100%{-webkit-transform:none}}@keyframes IgSlideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{-webkit-transform:none;transform:none}}.ig_bottom .ig_anim_slide_out,.ig_bottom.ig_anim_slide_out{animation-name:IgFadeOutDown;-moz-animation-name:IgFadeOutDown;-webkit-animation-name:IgFadeOutDown;animation-duration:.9s;-moz-animation-duration:.9s;-webkit-animation-duration:.9s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes IgFadeOutDown{0%{opacity:1;-webkit-transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:translate3d(0,100%,0)}}@keyframes IgFadeOutDown{0%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.ig_anim_slide_in,.ig_top .ig_anim_slide_in,.ig_top.ig_anim_slide_in{animation-name:IgSlideInDown;-moz-animation-name:IgSlideInDown;-webkit-animation-name:IgSlideInDown;animation-duration:.5s;-moz-animation-duration:.5s;-webkit-animation-duration:.5s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease}@-webkit-keyframes IgSlideInDown{0%{-webkit-transform:translate3d(0,-100%,0)}100%{-webkit-transform:none}}@keyframes IgSlideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{-webkit-transform:none;transform:none}}.ig_anim_slide_out,.ig_top .ig_anim_slide_out,.ig_top.ig_anim_slide_out{animation-name:IgFadeOutUp;-moz-animation-name:IgFadeOutUp;-webkit-animation-name:IgFadeOutUp;animation-duration:.9s;-moz-animation-duration:.9s;-webkit-animation-duration:.9s;animation-timing-function:ease;-moz-animation-timing-function:ease;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes IgFadeOutUp{0%{opacity:1;-webkit-transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:translate3d(0,-100%,0)}}@keyframes IgFadeOutUp{0%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}99.5%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}
assets/images/spinner-2x.gif ADDED
Binary file
assets/js/icegram.min.js CHANGED
@@ -1 +1 @@
1
- function Icegram(){}function Icegram_Message_Type(a){var a;this.root_container="#icegram_messages_container",this.data=a,this.type=a.type,this.data.delay_time=parseInt(this.data.delay_time),"string"!=typeof this.data.link||""==this.data.link||/^tel:/i.test(this.data.link)||/^https?:\/\//i.test(this.data.link)||(this.data.link="http://"+this.data.link),this.set_template(this.get_template_default()),this.init()}Icegram.prototype.init=function(a){if(void 0!=a){jQuery(window).trigger("preinit.icegram",[a]),this.data=a,this.defaults=jQuery.extend({},a.defaults),this.message_data=a.messages,this.messages,this.tracking_data=[],this.message_template_cache={},this.map_id_to_index={},this.map_type_to_index={},this.mode=void 0==window.ig_mode?"local":window.ig_mode,this.powered_by={link:"http://www.icegram.com/?utm_source=inapp&utm_campaign=poweredby&utm_medium="},this.powered_by.text=this.defaults.powered_by_text,this.powered_by.logo=this.defaults.powered_by_logo,jQuery("body").append('<div id="icegram_messages_container"></div>');this.messages=[];var b=this;this.message_data.length>0&&jQuery.each(this.message_data,function(a,c){try{if(-1==window.location.href.indexOf("campaign_preview_id")){if("yes"==c.retargeting&&1==jQuery.cookie("icegram_campaign_shown_"+c.campaign_id))return;if("yes"==c.retargeting_clicked&&1==jQuery.cookie("icegram_campaign_clicked_"+c.campaign_id))return}"undefined"!==c.ig_mobile_popup&&1==c.ig_mobile_popup&&(c.delay_time=-1);var d=null,e=c.type.split("-").join(" ").ucwords().split(" ").join("_");d="function"==typeof window["Icegram_Message_Type_"+e]?new window["Icegram_Message_Type_"+e](c):new Icegram_Message_Type(c),b.messages.push(d),b.map_id_to_index["_"+c.id]=a,b.map_type_to_index[c.type]=jQuery.isArray(b.map_type_to_index[c.type])?b.map_type_to_index[c.type]:new Array,b.map_type_to_index[c.type].push(a)}catch(f){console.log(f)}}),jQuery(window).on("unload",function(){"function"==typeof window.icegram.submit_tracking_data&&window.icegram.submit_tracking_data(!1)}),setInterval(function(){"function"==typeof window.icegram.submit_tracking_data&&window.icegram.submit_tracking_data(!0)},5e3),jQuery(window).trigger("init.icegram",[this])}},Icegram.prototype.timer_tick=function(){},Icegram.prototype.get_template_fn=function(a){return this.message_template_cache[a]},Icegram.prototype.set_template_fn=function(a,b){this.message_template_cache[a]=b},Icegram.prototype.get_message=function(a){return this.messages.length>a?this.messages[a]:void 0},Icegram.prototype.get_message_by_id=function(a){if(this.map_id_to_index.hasOwnProperty("_"+a)){var b=this.map_id_to_index["_"+a];return this.get_message(b)}},Icegram.prototype.get_message_by_campaign_id=function(a){a=String(a);var b=[],c=this.messages;return a.indexOf(" ")&&(a=a.split(" ")),jQuery.each(a,function(a,d){jQuery.each(c,function(a,c){d==c.data.campaign_id&&b.push(c)})}),b},Icegram.prototype.get_messages_by_type=function(a){if(this.map_type_to_index.hasOwnProperty(a)){var b=this.map_type_to_index[a],c=[];if(jQuery.isArray(b)){var d=this;jQuery.each(b,function(a,b){c.push(d.get_message(b))})}return c}},Icegram.prototype.get_powered_by=function(a){var b=jQuery.extend({},this.powered_by);return b.link=b.link+(a||""),b},Icegram.prototype.track=function(a,b){"object"==typeof b&&b.hasOwnProperty("message_id")&&b.hasOwnProperty("campaign_id")&&-1==b.message_id.indexOf("_00")&&(jQuery(window).trigger("track.icegram",[a,b]),this.tracking_data.push({type:a,params:b}))},Icegram.prototype.submit_tracking_data=function(a){var b=window.location.protocol.split(":"),c=b[0],d=this.data.ajax_url.split("://"),e=d[0];if(this.tracking_data.length>0&&-1==window.location.href.indexOf("campaign_preview_id")&&!this.is_bot()){var f={type:"POST",url:this.data.ajax_url,async:a||!1,data:{action:"icegram_event_track",event_data:JSON.parse(JSON.stringify(this.tracking_data)),ig_remote_url:"remote"==this.mode?window.location.href:void 0},success:function(a,b,c){},error:function(a,b,c){}};"remote"==this.mode?(f.xhrFields={withCredentials:!0},f.crossDomain=!0,f.async=!0):c!=e&&(f.xhrFields={withCredentials:!0},jQuery.extend(f.data,{ig_local_url_cs:window.location.href})),jQuery.ajax(f),this.tracking_data=[]}},Icegram.prototype.is_bot=function(){var a=/bot|spider|crawl|sucker|ia_archiver|alexa|spade|slurp|webbug|ZyBorg|Feedfetcher-Google|Mediapartners-Google|aolserver|seamonkey|binlar|casper|comodo|feedfinder|jakarta|java|larbin|libwww|pycurl|linkwalker|steeler|nutch|turnit|zmeu/i;return!!a.test(navigator.userAgent)},Icegram.prototype.hide_all_messages=function(){this.messages.length>0&&jQuery.each(this.messages,function(a,b){b.hide()})},Icegram_Message_Type.prototype.init=function(){this.render(),this.add_event_handlers()},Icegram_Message_Type.prototype.add_event_handlers=function(){this.el.on("click",{self:this},this.on_click),jQuery(window).on("resize",{self:this},this.on_resize)},Icegram_Message_Type.prototype.animations={},Icegram_Message_Type.prototype.embed_form=function(){if(-1===jQuery.inArray(this.data.type,["toast","badge","ribbon","exit-redirect"])){var a=null,b=this.data.form_layout,c=this.data.form_has_label,d=this.data.form_style||"none",e=this.data.label||void 0;if(d=d.toLowerCase().replace(" ","_"),void 0!=this.data.use_form&&"yes"==this.data.use_form&&(a=this.data.form_html),this.el.find("form.ig_embed_form").length>0){var f=this.el.find("form.ig_embed_form");b="inline",-1===jQuery.inArray(this.data.type,["messenger","tab","sidebar","interstitial","sticky"])&&(f.hasClass("ig_left")?b="left":f.hasClass("ig_right")&&(b="right")),"inline"==b&&this.el.find("form.ig_embed_form").replaceWith('<div class="ig_form_container layout_inline"></div>'),c=f.find(".ig_form_el_group label").length>0?"yes":void 0,0==f.find(".ig_button").length&&0==f.find("button[type=submit]").length&&(e=e||"Submit",f.append('<input class="ig_button" type="submit" value="'+e+'">')),a=jQuery("<div/>").append(f).html()}if(null==a)this.el.find(".ig_form_container").remove();else{var g=window.icegram.formProcess(this,a);if(g&&0==this.el.find(".ig_form_container form").length){var h=void 0!=this.data.form_header&&""!=this.data.form_header?'<div class="ig_form_header">'+this.data.form_header+"</div>":"",i=void 0!=this.data.form_footer&&""!=this.data.form_footer?'<div class="ig_form_footer">'+this.data.form_footer+"</div>":"";if(this.el.find(".ig_form_container").append(h).append(g).append(i),this.data.rainmaker_form_code&&""!=this.data.rainmaker_form_code){this.data.cta&&"form"!==this.data.cta&&this.data.show_response&&this.data.response_text&&(!this.data.response_text||""!=this.data.response_text)||(this.data.response_text=jQuery("<div/>").html(a).find(".rm_form_message").html()||""),this.el.find(".ig_form_container").addClass(jQuery("<div/>").html(a).find(".rm_form_container").data("type")).data("form-id",jQuery("<div/>").html(a).find(".rm_form_container").data("form-id")).addClass("rainmaker_form");var j=jQuery("<div/>").html(a).find("#rm_script"),k=jQuery("<div/>").html(a).find("#rm_style");this.el.find(".ig_form_container").prepend(k).append(j)}void 0==c?this.el.find(".ig_el_label").not("span.ig_el_label").remove():(this.el.find("input, textarea").removeAttr("placeholder"),this.el.find("select option.ig_el_placeholder").remove()),this.el.find(".ig_form_container .ig_button").length>0&&(this.el.find(".ig_button").not(".ig_form_container .ig_button").hide(),e=e||this.el.find(".ig_button").val()||"Submit",this.el.find(".ig_button").val(e)),this.el.addClass("ig_form_"+b);var l="";void 0!=this.data.form_bg_color&&""!=this.data.form_bg_color?(this.el.find(".ig_form_container").css("background-color",this.data.form_bg_color),l+=".ig_form_"+b+".ig_form_"+d+" .ig_form_container:before{ background-color:"+this.data.form_bg_color+"; border-color:"+this.data.form_bg_color+";}"):l+=".ig_form_"+b+".ig_form_"+d+" .ig_form_container:before{ display:none;}",void 0!=this.data.form_text_color&&""!=this.data.form_text_color&&this.el.find(".ig_form_container").css("color",this.data.form_text_color),this.el.addClass("ig_form_"+d).find(".ig_form_container").prepend('<style type="text/css">'+l+"</style>"),jQuery.each(this.el.find(".ig_form_container")||[],function(a,b){jQuery(b).find(".ig_form_els").first().addClass("ig_form_els_first").end().last().addClass("ig_form_els_last")})}}}},Icegram_Message_Type.prototype.render=function(){this.pre_render();var a=this.render_template();try{jQuery(this.root_container).append(a)}catch(b){}this.dom_id="icegram_message_"+this.data.id,this.el=jQuery("#"+this.dom_id),this.set_position();var c=window.icegram.get_powered_by(this.type);if(c.hasOwnProperty("link")&&c.hasOwnProperty("text")&&""!=c.text&&this.add_powered_by(c),void 0!=this.data.headline&&""!=this.data.headline||this.el.find(".ig_headline").hide(),void 0!=this.data.icon&&""!=this.data.icon||this.el.addClass("ig_no_icon").find(".ig_icon").remove(),void 0!=this.data.message&&""!=this.data.message||this.el.find(".ig_message").hide(),void 0!=this.data.label&&""!=this.data.label||this.el.find(".ig_button").hide(),this.embed_form(),void 0==this.data.use_theme_defaults||"yes"!=this.data.use_theme_defaults){if(void 0!=this.data.text_color&&""!=this.data.text_color&&(this.el.css("color",this.data.text_color),this.el.find(".ig_container").css("color",this.data.text_color)),void 0!=this.data.bg_color&&""!=this.data.bg_color&&(this.el.css("background-color",this.data.bg_color),this.el.find(".ig_container").css("background-color",this.data.bg_color)),void 0!=this.data.cta_bg_color&&""!=this.data.cta_bg_color){this.el.find('.ig_button, form input[type="submit"]').css("background-color",this.data.cta_bg_color);var d=window.icegram.hexToHsl(this.data.cta_bg_color);this.el.find('.ig_button, form input[type="submit"]').css("border-color","hsl("+d.h+","+(d.s-5)+"%,"+(d.l-8)+"%)")}void 0!=this.data.cta_text_color&&""!=this.data.cta_text_color&&this.el.find('.ig_button, form input[type="submit"]').css("color",this.data.cta_text_color)}this.data.use_custom_code&&this.data.custom_css&&this.el.prepend('<style id="ig_custom_css_'+this.data.id+'" type="text/css">'+this.data.custom_css.replace(/#ig_this_message/g,"#"+this.dom_id)+"</style>"),"string"==typeof this.data.link&&""!=this.data.link&&this.el.parent().find(".ig_cta, .ig_button").css("cursor","pointer"),this.post_render(),this.hide({},!0),this.set_up_show_trigger()},Icegram.prototype.formProcess=function(a,b){var c=jQuery("<div/>").html(b).find('input[name="fake_text"]').data("required_field",!0).end().find("input.rm_required_feild").data("required_field",!0).end().find(".gform_validation_container input").data("required_field",!0).end().find(".required_field").data("required_field",!0).end().find("input, label, select, textarea, button").not("br");if(c.length>0){var d=jQuery('<div class="ig_embed_form_container ig_clear_fix"></div>'),e=jQuery("<div/>").html(b).find("form").removeAttr("class").removeAttr("style").addClass("ig_clear_fix").empty(),f=".",g=0;jQuery.each(c,function(a,b){var c=jQuery(b),e=jQuery('<div class="ig_form_els"></div>');if(c.removeAttr("class").removeAttr("style"),(-1==c.attr("tabindex")||c.is('*[name*="[abs]"]')||c.data("required_field")||"_mc4wp_required_but_not_really"==c.attr("name"))&&(c.addClass("ig_form_required_field").removeData("required_field"),g--),"hidden"!=c.attr("type")&&c.prop("disabled")!==!0||(c.addClass("ig_form_hidden_field"),g--),c.is("label"))f=c.not("input, select, textarea, button, span, br").text().replace(/\s+/g," ")||".";else if((c.is("input")||c.is("button")||c.is("textarea")||c.is("select"))&&!c.is("input[type=radio]")){if(c.removeAttr("id"),c.is("button")){var h=c.not("br, span, div").text().trim()||"";c.remove(),c=jQuery('<input type="submit" value="'+h+'">')}!c.is("input[type=submit]")&&!c.is("input[type=button]")||c.is(".ig_form_hidden_field, .ig_form_required_field")||c.addClass("ig_button"),(c.is("input[type=text]")||c.is("input[type=email]"))&&c.attr("size",25),label_class="ig_el_label ig_button_label","."!=f&&(label_class="ig_el_label",c.is("select")?jQuery('<option class="ig_el_placeholder">'+f+"</option>").prependTo(c):c.attr("placeholder",f)),jQuery('<label class="'+label_class+'">'+f+"</label>").appendTo(e),f=".",e.append(c),d.append(e),g++}else c.is("input[type=radio]")&&(label_class="ig_el_label ig_button_label","."!=f&&(label_class="ig_el_label"),jQuery('<label><span class="'+label_class+'">'+f+"</span></label>").prepend(c).appendTo(e),f=".",e.addClass("ig_form_el_radio"),d.append(e),g++)});var h=["","ig_full","ig_half","ig_third","ig_quater"];return g=4>g?g:4,d.find(".ig_form_required_field").length<=0&&d.append('<div class="ig_form_els"><input class="ig_form_required_field" type="text" tabindex="-1" value="" /></div>'),d.addClass(h[g]).find(".ig_form_required_field").parent().removeClass("ig_form_els").css({position:"absolute",left:"-5000px"}).end().end().find(".ig_form_hidden_field").parent().removeClass("ig_form_els").css({display:"none"}),e.append(d),jQuery("<div/>").append(e).html()}return null},Icegram_Message_Type.prototype.render_template=function(){return"function"!=typeof window.icegram.get_template_fn(this.type)&&window.icegram.set_template_fn(this.type,new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+this.template.replace(/[\r\t\n]/g," ").split("{{").join(" ").replace(/((^|\}\})[^\t]*)'/g,"$1\r").replace(/\t=(.*?)\}\}/g,"',$1,'").split(" ").join("');").split("}}").join("p.push('").split("\r").join("\\'")+"');}return p.join('');")),window.icegram.get_template_fn(this.type)(this.data)},Icegram_Message_Type.prototype.pre_render=function(){},Icegram_Message_Type.prototype.post_render=function(){},Icegram_Message_Type.prototype.set_up_show_trigger=function(){if(isNaN(this.data.delay_time))this.show();else if(this.data.delay_time>=0){var a=this;this.timer=setTimeout(function(){a.show()},1e3*this.data.delay_time)}},Icegram_Message_Type.prototype.set_template=function(a){this.template=a},Icegram_Message_Type.prototype.get_template_default=function(){return'<div id="icegram_message_{{=id}}" class="icegram"><div class="ig_headline">{{=headline}}</div></div>'},Icegram_Message_Type.prototype.show=function(a,b){this.is_visible()||(this.animate("in"),this.pre_show(),this.el.show(a),this.el.addClass("ig_show").removeClass("ig_hide"),b!==!0&&this.track("shown"),this.post_show());var c=this;window.icegram.adjustFormContainerHeight(c)},Icegram_Message_Type.prototype.hide=function(a,b){if(this.is_visible()){var c=this;this.animate("out"),this.pre_hide(),setTimeout(function(){c.el.hasClass("ig_no_hide")||c.el.hide(a),c.el.addClass("ig_hide").removeClass("ig_show")},500),b!==!0&&this.track("closed"),this.post_hide()}},Icegram_Message_Type.prototype.set_position=function(){},Icegram_Message_Type.prototype.add_powered_by=function(a){},Icegram_Message_Type.prototype.pre_show=function(){},Icegram_Message_Type.prototype.post_show=function(){},Icegram_Message_Type.prototype.pre_hide=function(){},Icegram_Message_Type.prototype.post_hide=function(){},Icegram_Message_Type.prototype.track=function(a,b){"function"==typeof window.icegram.track&&(b=b||{},jQuery.extend(b,{message_id:this.data.id,campaign_id:this.data.campaign_id,expiry_time:this.data.expiry_time,expiry_time_clicked:this.data.expiry_time_clicked}),window.icegram.track(a,b))},Icegram_Message_Type.prototype.is_visible=function(){return this.el.hasClass("ig_show")},Icegram_Message_Type.prototype.toggle=function(a){this.is_visible()?this.hide(a):this.show(a)},Icegram_Message_Type.prototype.on_click=function(a){if(a.data=a.data||{self:this},jQuery(a.target).filter(".ig_close").length||jQuery(a.target).parents(".ig_close").length)return void a.data.self.hide();var b=jQuery(a.target).closest(".icegram").find("form:visible").first();(jQuery(a.target).filter(".ig_button, .ig_cta, :submit").length||jQuery(a.target).parents("button[type=submit]").length||jQuery(a.target).parents(".ig_button, .ig_cta").length&&!(b.find(".ig_button, input[type=button], input[type=submit], button[type=submit]").length>0))&&a.data.self.on_cta_click(a)},Icegram_Message_Type.prototype.on_resize=function(a){},Icegram_Message_Type.prototype.on_cta_click=function(a){a.data=a.data||{self:this};var b=jQuery(a.target).closest(".icegram").find("form:visible").first();return jQuery(b).length&&jQuery(b).find(".ig_form_required_field").length&&""!==jQuery(b).find(".ig_form_required_field").val()?(a.preventDefault(),void a.data.self.hide()):(a.data.self.track("clicked"),void(jQuery(b).length?jQuery(b).submit(function(a){jQuery(b).hasClass("ig_form_init_done")&&a.preventDefault()}):"string"==typeof a.data.self.data.link&&""!=a.data.self.data.link?(window.location.href=a.data.self.data.link,a.data.self.hide()):a.data.self.data.hide!==!1&&a.data.self.hide()))},Icegram_Message_Type.prototype.animate=function(a){if("undefined"!=typeof this.data.animation){var b=this.data.animation,c=this;"in"==a?"function"==typeof this.animations[b+"_in"]?this.animations[b+"_in"](c):this.el.hasClass("ig_anim_"+b+"_in")||(this.el.removeClass("ig_anim_"+b+"_out"),setTimeout(function(){c.el.addClass("ig_anim_"+b+"_in")},1)):"out"==a&&("function"==typeof this.animations[b+"_out"]?this.animations[b+"_out"](c):(this.el.removeClass("ig_anim_"+b+"_in"),setTimeout(function(){c.el.addClass("ig_anim_"+b+"_out")},1)))}},String.prototype.ucwords=function(){return this.toLowerCase().replace(/\b[a-z]/g,function(a){return a.toUpperCase()})},Icegram.prototype.adjustFormContainerHeight=function(a){var b="";if(a.el.hasClass("ig_form_left")||a.el.hasClass("ig_form_right")){b=a.el.hasClass("ig_form_left")?"left":"right";var c=a.el.find(".ig_data").outerHeight()>a.el.find(".ig_form_container.layout_"+b).outerHeight()?a.el.find(".ig_data").outerHeight():a.el.find(".ig_form_container.layout_"+b).outerHeight();a.el.find(".ig_form_container").outerHeight(c)}},Icegram.prototype.hexToRgb=function(a){var b=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a);return b?{r:parseInt(b[1],16),g:parseInt(b[2],16),b:parseInt(b[3],16)}:null},Icegram.prototype.rgbToHsl=function(a,b,c){a/=255,b/=255,c/=255;var d,e,f=Math.max(a,b,c),g=Math.min(a,b,c),h=(f+g)/2;if(f==g)d=e=0;else{var i=f-g;switch(e=h>.5?i/(2-f-g):i/(f+g),f){case a:d=(b-c)/i;break;case b:d=(c-a)/i+2;break;case c:d=(a-b)/i+4}h=Math.floor(100*h),e=Math.floor(100*e),d=Math.floor(60*d),0>d&&(d+=360)}return{h:d,s:e,l:h}},Icegram.prototype.hexToHsl=function(a){var b=window.icegram.hexToRgb(a);return window.icegram.rgbToHsl(b.r,b.g,b.b)},"function"!=typeof Object.create&&!function(){var a=function(){};Object.create=function(b){if(arguments.length>1)throw Error("Second argument not supported");if(null===b)throw Error("Cannot set a null [[Prototype]]");if("object"!=typeof b)throw TypeError("Argument must be an object");return a.prototype=b,new a}}(),void 0!==typeof jQuery.cookie&&!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}});;function Icegram_Message_Type_Action_Bar(a){Icegram_Message_Type.apply(this,arguments)}Icegram_Message_Type_Action_Bar.prototype=Object.create(Icegram_Message_Type.prototype),Icegram_Message_Type_Action_Bar.prototype.constructor=Icegram_Message_Type_Action_Bar,Icegram_Message_Type_Action_Bar.prototype.get_template_default=function(){return'<div class="icegram action_bar_{{=id}}" ><div class="ig_action_bar ig_container ig_{{=theme}} ig_no_hide" id="icegram_message_{{=id}}"><div class="ig_content ig_clear_fix"><div class="ig_close" id="ig_close_{{=id}}"><span></span></div><div class="ig_form_container layout_left"></div><div class="ig_data ig_clear_fix"><div class="ig_headline">{{=headline}}</div><div class="ig_message">{{=message}}</div></div><div class="ig_button">{{=label}}</div><div class="ig_form_container layout_right layout_bottom"></div></div></div></div>'},Icegram_Message_Type_Action_Bar.prototype.post_render=function(){void 0!=this.data.use_theme_defaults&&"yes"==this.data.use_theme_defaults||void 0!=this.data.bg_color&&""!=this.data.bg_color&&this.el.find(".ig_close").css("background-color",this.data.bg_color),"21"!==this.data.position&&0==jQuery("#ig_body_pushdown").length&&jQuery("body").prepend('<div id="ig_body_pushdown"></div>')},Icegram_Message_Type_Action_Bar.prototype.set_position=function(){switch(this.data.position){case"21":this.el.addClass("ig_bottom");break;case"01":default:this.el.addClass("ig_top")}},Icegram_Message_Type_Action_Bar.prototype.add_powered_by=function(a){this.el.addClass("ig_has_pwby").find(".ig_content").before('<div class="ig_powered_by" ><a href="'+a.link+'" target="_blank"><img src="'+a.logo+'" title="'+a.text+'"/></a></div>')},Icegram_Message_Type_Action_Bar.prototype.on_click=function(a){return a.data=a.data||{self:this},jQuery(a.target).filter(".ig_show .ig_close, .ig_show .ig_close span").length?void a.data.self.hide():jQuery(a.target).filter(".ig_hide .ig_close, .ig_hide .ig_close span").length?void a.data.self.show():void Icegram_Message_Type.prototype.on_click.apply(this,arguments)},Icegram_Message_Type_Action_Bar.prototype.post_show=function(){if("21"!==this.data.position){var a=this.el.outerHeight()||0;jQuery("#ig_body_pushdown").css("display","block").animate({height:a},500),jQuery("*",document.body).not(".ig_action_bar, .ig_popup, .ig_messenger, .ig_inline, .ig_overlay, .ig_sidebar, .ig_tab, .ig_interstitial ,#ig_body_pushdown ").each(function(){var b=window.getComputedStyle(this,null);("fixed"===b.position||"absolute"===b.position&&("BODY"===this.parentNode.nodeName||"HEADER"===this.nodeName))&&!isNaN(parseInt(b.top,10))&&this.getBoundingClientRect().top<=a&&jQuery(this).data("ig_fx_top",b.top).animate({top:parseInt(b.top,10)+a+"px"},300)})}},Icegram_Message_Type_Action_Bar.prototype.pre_hide=function(){"21"!==this.data.position&&(jQuery("#ig_body_pushdown").animate({height:0},300).css("display","none"),jQuery("*",document.body).not(".ig_action_bar, .ig_popup, .ig_messenger, .ig_inline, .ig_overlay, .ig_sidebar, .ig_tab, .ig_interstitial ,#ig_body_pushdown ").each(function(){"undefined"!=typeof jQuery(this).data("ig_fx_top")&&jQuery(this).animate({top:jQuery(this).data("ig_fx_top")},200)}))};;function Icegram_Message_Type_Messenger(a){Icegram_Message_Type.apply(this,arguments)}Icegram_Message_Type_Messenger.prototype=Object.create(Icegram_Message_Type.prototype),Icegram_Message_Type_Messenger.prototype.constructor=Icegram_Message_Type_Messenger,Icegram_Message_Type_Messenger.prototype.get_template_default=function(){return'<div class="icegram ig_messenger ig_{{=theme}} ig_container ig_cta" id="icegram_message_{{=id}}"><div class="ig_content"><div class="ig_close" id="ig_close_{{=id}}"></div><div class="ig_data"><div class="ig_headline">{{=headline}}</div><div class="ig_body"><img class="ig_icon" src="{{=icon}}"/><div class="ig_message">{{=message}}</div></div><div class="ig_footer"></div></div></div></div>'},Icegram_Message_Type_Messenger.prototype.set_position=function(){switch(this.data.position){case"20":this.el.addClass("ig_left ig_bottom");break;case"22":default:this.el.addClass("ig_right ig_bottom")}},Icegram_Message_Type_Messenger.prototype.add_powered_by=function(a){this.el.addClass("ig_has_pwby").find(".ig_content").after('<div class="ig_powered_by"><a href="'+a.link+'" target="_blank">'+a.text+"</a></div>")};;function Icegram_Message_Type_Popup(a){Icegram_Message_Type.apply(this,arguments)}Icegram_Message_Type_Popup.prototype=Object.create(Icegram_Message_Type.prototype),Icegram_Message_Type_Popup.prototype.constructor=Icegram_Message_Type_Popup,Icegram_Message_Type_Popup.prototype.get_template_default=function(){return'<div id="icegram_message_{{=id}}" class="icegram ig_popup ig_{{=theme}} ig_container mfp-hide"><div class="ig_close" id="popup_box_close_{{=id}}"></div><div class="ig_clear_fix" data={{=id}}><div class="ig_bg_overlay"></div><div class="ig_form_container layout_left"></div><div class="ig_data ig_clear_fix"><div class="ig_headline">{{=headline}}</div><div class="ig_content"><div class="ig_message ig_clear_fix">{{=message}}</div></div><div class="ig_button" >{{=label}}</div></div><div class="ig_form_container layout_right layout_bottom"></div></div></div>'},Icegram_Message_Type_Popup.prototype.post_render=function(){void 0!=this.data.use_theme_defaults&&"yes"==this.data.use_theme_defaults||void 0!=this.data.bg_color&&""!=this.data.bg_color&&this.el.find(".ig_bg_overlay").css("border-color",this.data.bg_color)},Icegram_Message_Type_Popup.prototype.show=function(a,b){if(!this.is_visible()){var c=this,d="#icegram_message_"+this.data.id;this.animate("in"),jQuery.magnificPopup.open({items:{src:d,type:"inline"},showCloseBtn:!1,callbacks:{close:function(){b!==!0&&c.track("closed"),c.el.removeClass("ig_show")},open:function(){window.icegram.adjustFormContainerHeight(c)}}}),c.el.addClass("ig_show").removeClass("ig_hide"),b!==!0&&this.track("shown")}},Icegram_Message_Type_Popup.prototype.add_powered_by=function(a){setTimeout(function(){jQuery(".mfp-wrap").append('<div class="ig_powered_by"><a href="'+a.link+'" target="_blank">'+a.text+"</a></div>")},1e3+1e3*this.data.delay_time)},Icegram_Message_Type_Popup.prototype.hide=function(a,b){if(this.is_visible()){var c="#icegram_message_"+this.data.id,d=this;this.animate("out"),setTimeout(function(){d.el.addClass("ig_hide").removeClass("ig_show"),jQuery.magnificPopup.close({items:{src:c,type:"inline"}})},500)}},"undefined"==typeof jQuery.magnificPopup&&!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):window.jQuery||window.Zepto)}(function(a){var b,c,d,e,f,g,h="Close",i="BeforeClose",j="AfterClose",k="BeforeAppend",l="MarkupParse",m="Open",n="Change",o="mfp",p="."+o,q="mfp-ready",r="mfp-removing",s="mfp-prevent-close",t=function(){},u=!!window.jQuery,v=a(window),w=function(a,c){b.ev.on(o+a+p,c)},x=function(b,c,d,e){var f=document.createElement("div");return f.className="mfp-"+b,d&&(f.innerHTML=d),e?c&&c.appendChild(f):(f=a(f),c&&f.appendTo(c)),f},y=function(c,d){b.ev.triggerHandler(o+c,d),b.st.callbacks&&(c=c.charAt(0).toLowerCase()+c.slice(1),b.st.callbacks[c]&&b.st.callbacks[c].apply(b,a.isArray(d)?d:[d]))},z=function(c){return c===g&&b.currTemplate.closeBtn||(b.currTemplate.closeBtn=a(b.st.closeMarkup.replace("%title%",b.st.tClose)),g=c),b.currTemplate.closeBtn},A=function(){a.magnificPopup.instance||(b=new t,b.init(),a.magnificPopup.instance=b)},B=function(){var a=document.createElement("p").style,b=["ms","O","Moz","Webkit"];if(void 0!==a.transition)return!0;for(;b.length;)if(b.pop()+"Transition"in a)return!0;return!1};t.prototype={constructor:t,init:function(){var c=navigator.appVersion;b.isIE7=-1!==c.indexOf("MSIE 7."),b.isIE8=-1!==c.indexOf("MSIE 8."),b.isLowIE=b.isIE7||b.isIE8,b.isAndroid=/android/gi.test(c),b.isIOS=/iphone|ipad|ipod/gi.test(c),b.supportsTransition=B(),b.probablyMobile=b.isAndroid||b.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),d=a(document),b.popupsCache={}},open:function(c){var e;if(c.isObj===!1){b.items=c.items.toArray(),b.index=0;var g,h=c.items;for(e=0;e<h.length;e++)if(g=h[e],g.parsed&&(g=g.el[0]),g===c.el[0]){b.index=e;break}}else b.items=a.isArray(c.items)?c.items:[c.items],b.index=c.index||0;if(b.isOpen)return void b.updateItemHTML();b.types=[],f="",c.mainEl&&c.mainEl.length?b.ev=c.mainEl.eq(0):b.ev=d,c.key?(b.popupsCache[c.key]||(b.popupsCache[c.key]={}),b.currTemplate=b.popupsCache[c.key]):b.currTemplate={},b.st=a.extend(!0,{},a.magnificPopup.defaults,c),b.fixedContentPos="auto"===b.st.fixedContentPos?!b.probablyMobile:b.st.fixedContentPos,b.st.modal&&(b.st.closeOnContentClick=!1,b.st.closeOnBgClick=!1,b.st.showCloseBtn=!1,b.st.enableEscapeKey=!1),b.bgOverlay||(b.bgOverlay=x("bg").on("click"+p,function(){b.close()}),b.wrap=x("wrap").attr("tabindex",-1).on("click"+p,function(a){b._checkIfClose(a.target)&&b.close()}),b.container=x("container",b.wrap)),b.contentContainer=x("content"),b.st.preloader&&(b.preloader=x("preloader",b.container,b.st.tLoading));var i=a.magnificPopup.modules;for(e=0;e<i.length;e++){var j=i[e];j=j.charAt(0).toUpperCase()+j.slice(1),b["init"+j].call(b)}y("BeforeOpen"),b.st.showCloseBtn&&(b.st.closeBtnInside?(w(l,function(a,b,c,d){c.close_replaceWith=z(d.type)}),f+=" mfp-close-btn-in"):b.wrap.append(z())),b.st.alignTop&&(f+=" mfp-align-top"),b.fixedContentPos?b.wrap.css({overflow:b.st.overflowY,overflowX:"hidden",overflowY:b.st.overflowY}):b.wrap.css({top:v.scrollTop(),position:"absolute"}),(b.st.fixedBgPos===!1||"auto"===b.st.fixedBgPos&&!b.fixedContentPos)&&b.bgOverlay.css({height:d.height(),position:"absolute"}),b.st.enableEscapeKey&&d.on("keyup"+p,function(a){27===a.keyCode&&b.close()}),v.on("resize"+p,function(){b.updateSize()}),b.st.closeOnContentClick||(f+=" mfp-auto-cursor"),f&&b.wrap.addClass(f);var k=b.wH=v.height(),n={};if(b.fixedContentPos&&b._hasScrollBar(k)){var o=b._getScrollbarSize();o&&(n.marginRight=o)}b.fixedContentPos&&(b.isIE7?a("body, html").css("overflow","hidden"):n.overflow="hidden");var r=b.st.mainClass;return b.isIE7&&(r+=" mfp-ie7"),r&&b._addClassToMFP(r),b.updateItemHTML(),y("BuildControls"),a("html").css(n),b.bgOverlay.add(b.wrap).prependTo(b.st.prependTo||a(document.body)),b._lastFocusedEl=document.activeElement,setTimeout(function(){b.content?(b._addClassToMFP(q),b._setFocus()):b.bgOverlay.addClass(q),d.on("focusin"+p,b._onFocusIn)},16),b.isOpen=!0,b.updateSize(k),y(m),c},close:function(){b.isOpen&&(y(i),b.isOpen=!1,b.st.removalDelay&&!b.isLowIE&&b.supportsTransition?(b._addClassToMFP(r),setTimeout(function(){b._close()},b.st.removalDelay)):b._close())},_close:function(){y(h);var c=r+" "+q+" ";if(b.bgOverlay.detach(),b.wrap.detach(),b.container.empty(),b.st.mainClass&&(c+=b.st.mainClass+" "),b._removeClassFromMFP(c),b.fixedContentPos){var e={marginRight:""};b.isIE7?a("body, html").css("overflow",""):e.overflow="",a("html").css(e)}d.off("keyup"+p+" focusin"+p),b.ev.off(p),b.wrap.attr("class","mfp-wrap").removeAttr("style"),b.bgOverlay.attr("class","mfp-bg"),b.container.attr("class","mfp-container"),b.st.showCloseBtn&&(!b.st.closeBtnInside||b.currTemplate[b.currItem.type]===!0)&&b.currTemplate.closeBtn&&b.currTemplate.closeBtn.detach(),b._lastFocusedEl&&a(b._lastFocusedEl).focus(),b.currItem=null,b.content=null,b.currTemplate=null,b.prevHeight=0,y(j)},updateSize:function(a){if(b.isIOS){var c=document.documentElement.clientWidth/window.innerWidth,d=window.innerHeight*c;b.wrap.css("height",d),b.wH=d}else b.wH=a||v.height();b.fixedContentPos||b.wrap.css("height",b.wH),y("Resize")},updateItemHTML:function(){var c=b.items[b.index];b.contentContainer.detach(),b.content&&b.content.detach(),c.parsed||(c=b.parseEl(b.index));var d=c.type;if(y("BeforeChange",[b.currItem?b.currItem.type:"",d]),b.currItem=c,!b.currTemplate[d]){var f=b.st[d]?b.st[d].markup:!1;y("FirstMarkupParse",f),f?b.currTemplate[d]=a(f):b.currTemplate[d]=!0}e&&e!==c.type&&b.container.removeClass("mfp-"+e+"-holder");var g=b["get"+d.charAt(0).toUpperCase()+d.slice(1)](c,b.currTemplate[d]);b.appendContent(g,d),c.preloaded=!0,y(n,c),e=c.type,b.container.prepend(b.contentContainer),y("AfterChange")},appendContent:function(a,c){b.content=a,a?b.st.showCloseBtn&&b.st.closeBtnInside&&b.currTemplate[c]===!0?b.content.find(".mfp-close").length||b.content.append(z()):b.content=a:b.content="",y(k),b.container.addClass("mfp-"+c+"-holder"),b.contentContainer.append(b.content)},parseEl:function(c){var d,e=b.items[c];if(e.tagName?e={el:a(e)}:(d=e.type,e={data:e,src:e.src}),e.el){for(var f=b.types,g=0;g<f.length;g++)if(e.el.hasClass("mfp-"+f[g])){d=f[g];break}e.src=e.el.attr("data-mfp-src"),e.src||(e.src=e.el.attr("href"))}return e.type=d||b.st.type||"inline",e.index=c,e.parsed=!0,b.items[c]=e,y("ElementParse",e),b.items[c]},addGroup:function(a,c){var d=function(d){d.mfpEl=this,b._openClick(d,a,c)};c||(c={});var e="click.magnificPopup";c.mainEl=a,c.items?(c.isObj=!0,a.off(e).on(e,d)):(c.isObj=!1,c.delegate?a.off(e).on(e,c.delegate,d):(c.items=a,a.off(e).on(e,d)))},_openClick:function(c,d,e){var f=void 0!==e.midClick?e.midClick:a.magnificPopup.defaults.midClick;if(f||2!==c.which&&!c.ctrlKey&&!c.metaKey){var g=void 0!==e.disableOn?e.disableOn:a.magnificPopup.defaults.disableOn;if(g)if(a.isFunction(g)){if(!g.call(b))return!0}else if(v.width()<g)return!0;c.type&&(c.preventDefault(),b.isOpen&&c.stopPropagation()),e.el=a(c.mfpEl),e.delegate&&(e.items=d.find(e.delegate)),b.open(e)}},updateStatus:function(a,d){if(b.preloader){c!==a&&b.container.removeClass("mfp-s-"+c),!d&&"loading"===a&&(d=b.st.tLoading);var e={status:a,text:d};y("UpdateStatus",e),a=e.status,d=e.text,b.preloader.html(d),b.preloader.find("a").on("click",function(a){a.stopImmediatePropagation()}),b.container.addClass("mfp-s-"+a),c=a}},_checkIfClose:function(c){if(!a(c).hasClass(s)){var d=b.st.closeOnContentClick,e=b.st.closeOnBgClick;if(d&&e)return!0;if(!b.content||a(c).hasClass("mfp-close")||b.preloader&&c===b.preloader[0])return!0;if(c===b.content[0]||a.contains(b.content[0],c)){if(d)return!0}else if(e&&a.contains(document,c))return!0;return!1}},_addClassToMFP:function(a){b.bgOverlay.addClass(a),b.wrap.addClass(a)},_removeClassFromMFP:function(a){this.bgOverlay.removeClass(a),b.wrap.removeClass(a)},_hasScrollBar:function(a){return(b.isIE7?d.height():document.body.scrollHeight)>(a||v.height())},_setFocus:function(){(b.st.focus?b.content.find(b.st.focus).eq(0):b.wrap).focus()},_onFocusIn:function(c){return c.target===b.wrap[0]||a.contains(b.wrap[0],c.target)?void 0:(b._setFocus(),!1)},_parseMarkup:function(b,c,d){var e;d.data&&(c=a.extend(d.data,c)),y(l,[b,c,d]),a.each(c,function(a,c){if(void 0===c||c===!1)return!0;if(e=a.split("_"),e.length>1){var d=b.find(p+"-"+e[0]);if(d.length>0){var f=e[1];"replaceWith"===f?d[0]!==c[0]&&d.replaceWith(c):"img"===f?d.is("img")?d.attr("src",c):d.replaceWith('<img src="'+c+'" class="'+d.attr("class")+'" />'):d.attr(e[1],c)}}else b.find(p+"-"+a).html(c)})},_getScrollbarSize:function(){if(void 0===b.scrollbarSize){var a=document.createElement("div");a.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(a),b.scrollbarSize=a.offsetWidth-a.clientWidth,document.body.removeChild(a)}return b.scrollbarSize}},a.magnificPopup={instance:null,proto:t.prototype,modules:[],open:function(b,c){return A(),b=b?a.extend(!0,{},b):{},b.isObj=!0,b.index=c||0,this.instance.open(b)},close:function(){return a.magnificPopup.instance&&a.magnificPopup.instance.close()},registerModule:function(b,c){c.options&&(a.magnificPopup.defaults[b]=c.options),a.extend(this.proto,c.proto),this.modules.push(b)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'<button title="%title%" type="button" class="mfp-close">&times;</button>',tClose:"Close (Esc)",tLoading:"Loading..."}},a.fn.magnificPopup=function(c){A();var d=a(this);if("string"==typeof c)if("open"===c){var e,f=u?d.data("magnificPopup"):d[0].magnificPopup,g=parseInt(arguments[1],10)||0;f.items?e=f.items[g]:(e=d,f.delegate&&(e=e.find(f.delegate)),e=e.eq(g)),b._openClick({mfpEl:e},d,f)}else b.isOpen&&b[c].apply(b,Array.prototype.slice.call(arguments,1));else c=a.extend(!0,{},c),u?d.data("magnificPopup",c):d[0].magnificPopup=c,b.addGroup(d,c);return d};var C,D,E,F="inline",G=function(){E&&(D.after(E.addClass(C)).detach(),E=null)};a.magnificPopup.registerModule(F,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){b.types.push(F),w(h+"."+F,function(){G()})},getInline:function(c,d){if(G(),c.src){var e=b.st.inline,f=a(c.src);if(f.length){var g=f[0].parentNode;g&&g.tagName&&(D||(C=e.hiddenClass,D=x(C),C="mfp-"+C),E=f.after(D).detach().removeClass(C)),b.updateStatus("ready")}else b.updateStatus("error",e.tNotFound),f=a("<div>");return c.inlineElement=f,f}return b.updateStatus("ready"),b._parseMarkup(d,{},c),d}}});var H,I=function(c){if(c.data&&void 0!==c.data.title)return c.data.title;var d=b.st.image.titleSrc;if(d){if(a.isFunction(d))return d.call(b,c);if(c.el)return c.el.attr(d)||""}return""};a.magnificPopup.registerModule("image",{options:{markup:'<div class="mfp-figure"><div class="mfp-close"></div><figure><div class="mfp-img"></div><figcaption><div class="mfp-bottom-bar"><div class="mfp-title"></div><div class="mfp-counter"></div></div></figcaption></figure></div>',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'<a href="%url%">The image</a> could not be loaded.'},proto:{initImage:function(){var c=b.st.image,d=".image";b.types.push("image"),w(m+d,function(){"image"===b.currItem.type&&c.cursor&&a(document.body).addClass(c.cursor)}),w(h+d,function(){c.cursor&&a(document.body).removeClass(c.cursor),v.off("resize"+p)}),w("Resize"+d,b.resizeImage),b.isLowIE&&w("AfterChange",b.resizeImage)},resizeImage:function(){var a=b.currItem;if(a&&a.img&&b.st.image.verticalFit){var c=0;b.isLowIE&&(c=parseInt(a.img.css("padding-top"),10)+parseInt(a.img.css("padding-bottom"),10)),a.img.css("max-height",b.wH-c)}},_onImageHasSize:function(a){a.img&&(a.hasSize=!0,H&&clearInterval(H),a.isCheckingImgSize=!1,y("ImageHasSize",a),a.imgHidden&&(b.content&&b.content.removeClass("mfp-loading"),a.imgHidden=!1))},findImageSize:function(a){var c=0,d=a.img[0],e=function(f){H&&clearInterval(H),H=setInterval(function(){return d.naturalWidth>0?void b._onImageHasSize(a):(c>200&&clearInterval(H),c++,3===c?e(10):40===c?e(50):100===c&&e(500),void 0)},f)};e(1)},getImage:function(c,d){var e=0,f=function(){c&&(c.img[0].complete?(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("ready")),c.hasSize=!0,c.loaded=!0,y("ImageLoadComplete")):(e++,200>e?setTimeout(f,100):g()))},g=function(){c&&(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("error",h.tError.replace("%url%",c.src))),c.hasSize=!0,c.loaded=!0,c.loadError=!0)},h=b.st.image,i=d.find(".mfp-img");if(i.length){var j=document.createElement("img");j.className="mfp-img",c.el&&c.el.find("img").length&&(j.alt=c.el.find("img").attr("alt")),c.img=a(j).on("load.mfploader",f).on("error.mfploader",g),j.src=c.src,i.is("img")&&(c.img=c.img.clone()),j=c.img[0],j.naturalWidth>0?c.hasSize=!0:j.width||(c.hasSize=!1)}return b._parseMarkup(d,{title:I(c),img_replaceWith:c.img},c),b.resizeImage(),c.hasSize?(H&&clearInterval(H),c.loadError?(d.addClass("mfp-loading"),b.updateStatus("error",h.tError.replace("%url%",c.src))):(d.removeClass("mfp-loading"),b.updateStatus("ready")),d):(b.updateStatus("loading"),c.loading=!0,c.hasSize||(c.imgHidden=!0,d.addClass("mfp-loading"),b.findImageSize(c)),d)}}});var J,K=function(){return void 0===J&&(J=void 0!==document.createElement("p").style.MozTransform),J};a.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(a){return a.is("img")?a:a.find("img")}},proto:{initZoom:function(){var a,c=b.st.zoom,d=".zoom";if(c.enabled&&b.supportsTransition){var e,f,g=c.duration,j=function(a){var b=a.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),d="all "+c.duration/1e3+"s "+c.easing,e={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},f="transition";return e["-webkit-"+f]=e["-moz-"+f]=e["-o-"+f]=e[f]=d,b.css(e),b},k=function(){b.content.css("visibility","visible")};w("BuildControls"+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.content.css("visibility","hidden"),a=b._getItemToZoom(),!a)return void k();f=j(a),f.css(b._getOffset()),b.wrap.append(f),e=setTimeout(function(){f.css(b._getOffset(!0)),e=setTimeout(function(){k(),setTimeout(function(){f.remove(),a=f=null,y("ZoomAnimationEnded")},16)},g)},16)}}),w(i+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.st.removalDelay=g,!a){if(a=b._getItemToZoom(),!a)return;f=j(a)}f.css(b._getOffset(!0)),b.wrap.append(f),b.content.css("visibility","hidden"),setTimeout(function(){f.css(b._getOffset())},16)}}),w(h+d,function(){b._allowZoom()&&(k(),f&&f.remove(),a=null)})}},_allowZoom:function(){return"image"===b.currItem.type},_getItemToZoom:function(){return b.currItem.hasSize?b.currItem.img:!1},_getOffset:function(c){var d;d=c?b.currItem.img:b.st.zoom.opener(b.currItem.el||b.currItem);var e=d.offset(),f=parseInt(d.css("padding-top"),10),g=parseInt(d.css("padding-bottom"),10);e.top-=a(window).scrollTop()-f;var h={width:d.width(),height:(u?d.innerHeight():d[0].offsetHeight)-g-f};return K()?h["-moz-transform"]=h.transform="translate("+e.left+"px,"+e.top+"px)":(h.left=e.left,h.top=e.top),h}}});var L="retina";a.magnificPopup.registerModule(L,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=b.st.retina,c=a.ratio;c=isNaN(c)?c():c,c>1&&(w("ImageHasSize."+L,function(a,b){b.img.css({"max-width":b.img[0].naturalWidth/c,width:"100%"})}),w("ElementParse."+L,function(b,d){d.src=a.replaceSrc(d,c)}))}}}}),A()});;function Icegram_Message_Type_Toast(a){this.width=300,this.sticky=!1,this.duration=1e4,Icegram_Message_Type.apply(this,arguments)}Icegram_Message_Type_Toast.prototype=Object.create(Icegram_Message_Type.prototype),Icegram_Message_Type_Toast.prototype.constructor=Icegram_Message_Type_Toast,Icegram_Message_Type_Toast.prototype.get_template_default=function(){return'<li class="icegram ig_toast ig_container ig_{{=theme}} ig_cta" data="{{=id}}" id="icegram_message_{{=id}}"><div class="ig_wrapper"><div class="ig_content"><div class="ig_base"></div><div class="ig_line"></div><img class="ig_icon" src="{{=icon}}"/><div class="ig_headline">{{=headline}}</div><div class="ig_message">{{=message}}</div></div></div></li>'},Icegram_Message_Type_Toast.prototype.pre_render=function(){if("10"!=this.data.position&&"12"!=this.data.position||(this.data.position="20"),jQuery("ul#"+this.data.position).length)var a=jQuery("ul#"+this.data.position);else{var a=jQuery('<ul id="'+this.data.position+'"></ul>').addClass("ig_toast_block").appendTo(this.root_container).hide();a.width(this.width),"00"==this.data.position?a.css({top:"0",left:"0"}).addClass("ig_left").addClass("ig_top"):"01"==this.data.position?a.css({top:"0",left:"50%",margin:"5px 0 0 -"+this.width/2+"px"}).addClass("ig_center").addClass("ig_top"):"02"==this.data.position?a.css({top:"0",right:"0"}).addClass("ig_right").addClass("ig_top"):"20"==this.data.position?a.css({bottom:"0",left:"0"}).addClass("ig_left").addClass("ig_bottom"):"21"==this.data.position?a.css({bottom:"0",left:"50%",margin:"5px 0 0 -"+this.width/2+"px"}).addClass("ig_center").addClass("ig_bottom"):"22"==this.data.position?a.css({bottom:"0",right:"0"}).addClass("ig_right").addClass("ig_bottom"):"11"==this.data.position&&a.css({top:"50%",left:"50%",margin:"-"+this.width/2+"px 0 0 -"+this.width/2+"px"}).addClass("ig_center").addClass("ig_top")}this.root_container=a},Icegram_Message_Type_Toast.prototype.pre_show=function(){!this.root_container.hasClass("active")&&this.root_container.addClass("active").show()},Icegram_Message_Type_Toast.prototype.post_show=function(){var a=this;!this.sticky&&this.duration>0&&setTimeout(function(){a.hide(),a.root_container.children().length||a.root_container.removeClass("active").hide()},this.duration)};
1
+ function Icegram(){}function Icegram_Message_Type(a){var a;this.root_container="#icegram_messages_container",this.data=a,this.type=a.type,this.data.delay_time=parseInt(this.data.delay_time),"string"!=typeof this.data.link||""==this.data.link||/^tel:/i.test(this.data.link)||/^https?:\/\//i.test(this.data.link)||(this.data.link="http://"+this.data.link),this.set_template(this.get_template_default()),this.init()}Icegram.prototype.init=function(a){if(void 0!=a){jQuery(window).trigger("preinit.icegram",[a]),this.data=a,this.defaults=jQuery.extend({},a.defaults),this.message_data=a.messages,this.messages,this.tracking_data=[],this.message_template_cache={},this.map_id_to_index={},this.map_type_to_index={},this.mode=void 0==window.ig_mode?"local":window.ig_mode,this.powered_by={link:"http://www.icegram.com/?utm_source=inapp&utm_campaign=poweredby&utm_medium="},this.powered_by.text=this.defaults.powered_by_text,this.powered_by.logo=this.defaults.powered_by_logo,jQuery("body").append('<div id="icegram_messages_container"></div>');this.messages=[];var b=this;this.message_data.length>0&&jQuery.each(this.message_data,function(a,c){try{if(-1==window.location.href.indexOf("campaign_preview_id")){if("yes"==c.retargeting&&1==jQuery.cookie("icegram_campaign_shown_"+c.campaign_id))return;if("yes"==c.retargeting_clicked&&1==jQuery.cookie("icegram_campaign_clicked_"+c.campaign_id))return}"undefined"!==c.ig_mobile_popup&&1==c.ig_mobile_popup&&(c.delay_time=-1);var d=null,e=c.type.split("-").join(" ").ucwords().split(" ").join("_");d="function"==typeof window["Icegram_Message_Type_"+e]?new window["Icegram_Message_Type_"+e](c):new Icegram_Message_Type(c),b.messages.push(d),b.map_id_to_index["_"+c.id]=a,b.map_type_to_index[c.type]=jQuery.isArray(b.map_type_to_index[c.type])?b.map_type_to_index[c.type]:new Array,b.map_type_to_index[c.type].push(a)}catch(f){console.log(f)}}),jQuery(window).on("unload",function(){"function"==typeof window.icegram.submit_tracking_data&&window.icegram.submit_tracking_data(!1)}),setInterval(function(){"function"==typeof window.icegram.submit_tracking_data&&window.icegram.submit_tracking_data(!0)},5e3),jQuery(window).trigger("init.icegram",[this])}},Icegram.prototype.timer_tick=function(){},Icegram.prototype.get_template_fn=function(a){return this.message_template_cache[a]},Icegram.prototype.set_template_fn=function(a,b){this.message_template_cache[a]=b},Icegram.prototype.get_message=function(a){return this.messages.length>a?this.messages[a]:void 0},Icegram.prototype.get_message_by_id=function(a){if(this.map_id_to_index.hasOwnProperty("_"+a)){var b=this.map_id_to_index["_"+a];return this.get_message(b)}},Icegram.prototype.get_message_by_campaign_id=function(a){a=String(a);var b=[],c=this.messages;return a.indexOf(" ")&&(a=a.split(" ")),jQuery.each(a,function(a,d){jQuery.each(c,function(a,c){d==c.data.campaign_id&&b.push(c)})}),b},Icegram.prototype.get_messages_by_type=function(a){if(this.map_type_to_index.hasOwnProperty(a)){var b=this.map_type_to_index[a],c=[];if(jQuery.isArray(b)){var d=this;jQuery.each(b,function(a,b){c.push(d.get_message(b))})}return c}},Icegram.prototype.get_powered_by=function(a){var b=jQuery.extend({},this.powered_by);return b.link=b.link+(a||""),b},Icegram.prototype.track=function(a,b){"object"==typeof b&&b.hasOwnProperty("message_id")&&b.hasOwnProperty("campaign_id")&&-1==b.message_id.indexOf("_00")&&(jQuery(window).trigger("track.icegram",[a,b]),this.tracking_data.push({type:a,params:b}))},Icegram.prototype.submit_tracking_data=function(a){var b=window.location.protocol.split(":"),c=b[0],d=this.data.ajax_url.split("://"),e=d[0];if(this.tracking_data.length>0&&-1==window.location.href.indexOf("campaign_preview_id")&&!this.is_bot()){var f={type:"POST",url:this.data.ajax_url,async:a||!1,data:{action:"icegram_event_track",event_data:JSON.parse(JSON.stringify(this.tracking_data)),ig_remote_url:"remote"==this.mode?window.location.href:void 0},success:function(a,b,c){},error:function(a,b,c){}};"remote"==this.mode?(f.xhrFields={withCredentials:!0},f.crossDomain=!0,f.async=!0):c!=e&&(f.xhrFields={withCredentials:!0},jQuery.extend(f.data,{ig_local_url_cs:window.location.href})),jQuery.ajax(f),this.tracking_data=[]}},Icegram.prototype.is_bot=function(){var a=/bot|spider|crawl|sucker|ia_archiver|alexa|spade|slurp|webbug|ZyBorg|Feedfetcher-Google|Mediapartners-Google|aolserver|seamonkey|binlar|casper|comodo|feedfinder|jakarta|java|larbin|libwww|pycurl|linkwalker|steeler|nutch|turnit|zmeu/i;return!!a.test(navigator.userAgent)},Icegram.prototype.hide_all_messages=function(){this.messages.length>0&&jQuery.each(this.messages,function(a,b){b.hide()})},Icegram_Message_Type.prototype.init=function(){this.render(),this.add_event_handlers()},Icegram_Message_Type.prototype.add_event_handlers=function(){this.el.on("click",{self:this},this.on_click),jQuery(window).on("resize",{self:this},this.on_resize)},Icegram_Message_Type.prototype.animations={},Icegram_Message_Type.prototype.embed_form=function(){if(-1===jQuery.inArray(this.data.type,["toast","badge","ribbon","exit-redirect"])){var a=null,b=this.data.form_layout,c=this.data.form_has_label,d=this.data.form_style||"none",e=this.data.label||void 0;if(d=d.toLowerCase().replace(" ","_"),void 0!=this.data.use_form&&"yes"==this.data.use_form&&(a=this.data.form_html),this.el.find("form.ig_embed_form").length>0){var f=this.el.find("form.ig_embed_form");b="inline",-1===jQuery.inArray(this.data.type,["messenger","tab","sidebar","interstitial","sticky"])&&(f.hasClass("ig_left")?b="left":f.hasClass("ig_right")&&(b="right")),"inline"==b&&this.el.find("form.ig_embed_form").replaceWith('<div class="ig_form_container layout_inline"></div>'),c=f.find(".ig_form_el_group label").length>0?"yes":void 0,0==f.find(".ig_button").length&&0==f.find("button[type=submit]").length&&(e=e||"Submit",f.append('<input class="ig_button" type="submit" value="'+e+'">')),a=jQuery("<div/>").append(f).html()}if(null==a)this.el.find(".ig_form_container").remove();else{var g=window.icegram.formProcess(this,a);if(g&&0==this.el.find(".ig_form_container form").length){var h=void 0!=this.data.form_header&&""!=this.data.form_header?'<div class="ig_form_header">'+this.data.form_header+"</div>":"",i=void 0!=this.data.form_footer&&""!=this.data.form_footer?'<div class="ig_form_footer">'+this.data.form_footer+"</div>":"";if(this.el.find(".ig_form_container").append(h).append(g).append(i),this.data.rainmaker_form_code&&""!=this.data.rainmaker_form_code){this.data.cta&&"form"!==this.data.cta&&this.data.show_response&&this.data.response_text&&(!this.data.response_text||""!=this.data.response_text)||(this.data.response_text=jQuery("<div/>").html(a).find(".rm_form_message").html()||""),this.el.find(".ig_form_container").addClass(jQuery("<div/>").html(a).find(".rm_form_container").data("type")).data("form-id",jQuery("<div/>").html(a).find(".rm_form_container").data("form-id")).addClass("rainmaker_form");var j=jQuery("<div/>").html(a).find("#rm_script"),k=jQuery("<div/>").html(a).find("#rm_style");this.el.find(".ig_form_container").prepend(k).append(j)}void 0==c?this.el.find(".ig_el_label").not("span.ig_el_label").remove():(this.el.find("input, textarea").removeAttr("placeholder"),this.el.find("select option.ig_el_placeholder").remove()),this.el.find(".ig_form_container .ig_button").length>0&&(this.el.find(".ig_button").not(".ig_form_container .ig_button").hide(),e=e||this.el.find(".ig_button").val()||"Submit",this.el.find(".ig_button").val(e)),this.el.addClass("ig_form_"+b);var l="";void 0!=this.data.form_bg_color&&""!=this.data.form_bg_color?(this.el.find(".ig_form_container").css("background-color",this.data.form_bg_color),l+=".ig_form_"+b+".ig_form_"+d+" .ig_form_container:before{ background-color:"+this.data.form_bg_color+"; border-color:"+this.data.form_bg_color+";}"):l+=".ig_form_"+b+".ig_form_"+d+" .ig_form_container:before{ display:none;}",void 0!=this.data.form_text_color&&""!=this.data.form_text_color&&this.el.find(".ig_form_container").css("color",this.data.form_text_color),this.el.addClass("ig_form_"+d).find(".ig_form_container").prepend('<style type="text/css">'+l+"</style>"),jQuery.each(this.el.find(".ig_form_container")||[],function(a,b){jQuery(b).find(".ig_form_els").first().addClass("ig_form_els_first").end().last().addClass("ig_form_els_last")})}}}},Icegram_Message_Type.prototype.render=function(){this.pre_render();var a=this.render_template();try{jQuery(this.root_container).append(a)}catch(b){}this.dom_id="icegram_message_"+this.data.id,this.el=jQuery("#"+this.dom_id),this.set_position();var c=window.icegram.get_powered_by(this.type);if(c.hasOwnProperty("link")&&c.hasOwnProperty("text")&&""!=c.text&&this.add_powered_by(c),void 0!=this.data.headline&&""!=this.data.headline||this.el.find(".ig_headline").hide(),void 0!=this.data.icon&&""!=this.data.icon||this.el.addClass("ig_no_icon").find(".ig_icon").remove(),void 0!=this.data.message&&""!=this.data.message||this.el.find(".ig_message").hide(),void 0!=this.data.label&&""!=this.data.label||this.el.find(".ig_button").hide(),this.embed_form(),void 0==this.data.use_theme_defaults||"yes"!=this.data.use_theme_defaults){if(void 0!=this.data.text_color&&""!=this.data.text_color&&(this.el.css("color",this.data.text_color),this.el.find(".ig_container").css("color",this.data.text_color)),void 0!=this.data.bg_color&&""!=this.data.bg_color&&(this.el.css("background-color",this.data.bg_color),this.el.find(".ig_container").css("background-color",this.data.bg_color)),void 0!=this.data.cta_bg_color&&""!=this.data.cta_bg_color){this.el.find('.ig_button, form input[type="submit"]').css("background-color",this.data.cta_bg_color);var d=window.icegram.hexToHsl(this.data.cta_bg_color);this.el.find('.ig_button, form input[type="submit"]').css("border-color","hsl("+d.h+","+(d.s-5)+"%,"+(d.l-8)+"%)")}void 0!=this.data.cta_text_color&&""!=this.data.cta_text_color&&this.el.find('.ig_button, form input[type="submit"]').css("color",this.data.cta_text_color)}this.data.use_custom_code&&this.data.custom_css&&this.el.prepend('<style id="ig_custom_css_'+this.data.id+'" type="text/css">'+this.data.custom_css.replace(/#ig_this_message/g,"#"+this.dom_id)+"</style>"),"string"==typeof this.data.link&&""!=this.data.link&&this.el.parent().find(".ig_cta, .ig_button").css("cursor","pointer"),this.post_render(),this.hide({},!0),this.set_up_show_trigger()},Icegram.prototype.formProcess=function(a,b){var c=jQuery("<div/>").html(b).find('input[name="fake_text"]').data("required_field",!0).end().find("input.rm_required_feild").data("required_field",!0).end().find(".gform_validation_container input").data("required_field",!0).end().find(".required_field").data("required_field",!0).end().find("input, label, select, textarea, button").not("br");if(c.length>0){var d=jQuery('<div class="ig_embed_form_container ig_clear_fix"></div>'),e=jQuery("<div/>").html(b).find("form").removeAttr("class").removeAttr("style").addClass("ig_clear_fix").empty(),f=".",g=0;jQuery.each(c,function(a,b){var c=jQuery(b),e=jQuery('<div class="ig_form_els"></div>');if(c.removeAttr("class").removeAttr("style"),(-1==c.attr("tabindex")||c.is('*[name*="[abs]"]')||c.data("required_field")||"_mc4wp_required_but_not_really"==c.attr("name"))&&(c.addClass("ig_form_required_field").removeData("required_field"),g--),"hidden"!=c.attr("type")&&c.prop("disabled")!==!0||(c.addClass("ig_form_hidden_field"),g--),c.is("label"))f=c.not("input, select, textarea, button, span, br").text().replace(/\s+/g," ")||".";else if((c.is("input")||c.is("button")||c.is("textarea")||c.is("select"))&&!c.is("input[type=radio]")){if(c.removeAttr("id"),c.is("button")){var h=c.not("br, span, div").text().trim()||"";c.remove(),c=jQuery('<input type="submit" value="'+h+'">')}!c.is("input[type=submit]")&&!c.is("input[type=button]")||c.is(".ig_form_hidden_field, .ig_form_required_field")||c.addClass("ig_button"),(c.is("input[type=text]")||c.is("input[type=email]"))&&c.attr("size",25),label_class="ig_el_label ig_button_label","."!=f&&(label_class="ig_el_label",c.is("select")?jQuery('<option class="ig_el_placeholder">'+f+"</option>").prependTo(c):c.attr("placeholder",f)),jQuery('<label class="'+label_class+'">'+f+"</label>").appendTo(e),f=".",e.append(c),d.append(e),g++}else c.is("input[type=radio]")&&(label_class="ig_el_label ig_button_label","."!=f&&(label_class="ig_el_label"),jQuery('<label><span class="'+label_class+'">'+f+"</span></label>").prepend(c).appendTo(e),f=".",e.addClass("ig_form_el_radio"),d.append(e),g++)});var h=["","ig_full","ig_half","ig_third","ig_quater"];return g=4>g?g:4,d.find(".ig_form_required_field").length<=0&&d.append('<div class="ig_form_els"><input class="ig_form_required_field" type="text" tabindex="-1" value="" /></div>'),d.addClass(h[g]).find(".ig_form_required_field").parent().removeClass("ig_form_els").css({position:"absolute",left:"-5000px"}).end().end().find(".ig_form_hidden_field").parent().removeClass("ig_form_els").css({display:"none"}),e.append(d),jQuery("<div/>").append(e).html()}return null},Icegram_Message_Type.prototype.render_template=function(){return"function"!=typeof window.icegram.get_template_fn(this.type)&&window.icegram.set_template_fn(this.type,new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+this.template.replace(/[\r\t\n]/g," ").split("{{").join(" ").replace(/((^|\}\})[^\t]*)'/g,"$1\r").replace(/\t=(.*?)\}\}/g,"',$1,'").split(" ").join("');").split("}}").join("p.push('").split("\r").join("\\'")+"');}return p.join('');")),window.icegram.get_template_fn(this.type)(this.data)},Icegram_Message_Type.prototype.pre_render=function(){},Icegram_Message_Type.prototype.post_render=function(){},Icegram_Message_Type.prototype.set_up_show_trigger=function(){if(isNaN(this.data.delay_time))this.show();else if(this.data.delay_time>=0){var a=this;this.timer=setTimeout(function(){a.show()},1e3*this.data.delay_time)}},Icegram_Message_Type.prototype.set_template=function(a){this.template=a},Icegram_Message_Type.prototype.get_template_default=function(){return'<div id="icegram_message_{{=id}}" class="icegram"><div class="ig_headline">{{=headline}}</div></div>'},Icegram_Message_Type.prototype.show=function(a,b){this.is_visible()||(this.animate("in"),this.pre_show(),this.el.show(a),this.el.addClass("ig_show").removeClass("ig_hide"),b!==!0&&this.track("shown"),this.post_show());var c=this;window.icegram.adjustFormContainerHeight(c)},Icegram_Message_Type.prototype.hide=function(a,b){if(this.is_visible()){var c=this;this.animate("out"),this.pre_hide(),setTimeout(function(){c.el.hasClass("ig_no_hide")||c.el.hide(a),c.el.addClass("ig_hide").removeClass("ig_show")},500),b!==!0&&this.track("closed"),this.post_hide()}},Icegram_Message_Type.prototype.set_position=function(){},Icegram_Message_Type.prototype.add_powered_by=function(a){},Icegram_Message_Type.prototype.pre_show=function(){},Icegram_Message_Type.prototype.post_show=function(){},Icegram_Message_Type.prototype.pre_hide=function(){},Icegram_Message_Type.prototype.post_hide=function(){},Icegram_Message_Type.prototype.track=function(a,b){"function"==typeof window.icegram.track&&(b=b||{},jQuery.extend(b,{message_id:this.data.id,campaign_id:this.data.campaign_id,expiry_time:this.data.expiry_time,expiry_time_clicked:this.data.expiry_time_clicked}),window.icegram.track(a,b))},Icegram_Message_Type.prototype.is_visible=function(){return this.el.hasClass("ig_show")},Icegram_Message_Type.prototype.toggle=function(a){this.is_visible()?this.hide(a):this.show(a)},Icegram_Message_Type.prototype.on_click=function(a){if(a.data=a.data||{self:this},jQuery(a.target).filter(".ig_close").length||jQuery(a.target).parents(".ig_close").length)return void a.data.self.hide();var b=jQuery(a.target).closest(".icegram").find("form:visible").first();(jQuery(a.target).filter(".ig_button, .ig_cta, :submit").length||jQuery(a.target).parents("button[type=submit]").length||jQuery(a.target).parents(".ig_button, .ig_cta").length&&!(b.find(".ig_button, input[type=button], input[type=submit], button[type=submit]").length>0))&&a.data.self.on_cta_click(a)},Icegram_Message_Type.prototype.on_resize=function(a){},Icegram_Message_Type.prototype.on_cta_click=function(a){a.data=a.data||{self:this};var b=jQuery(a.target).closest(".icegram").find("form:visible").first();return jQuery(b).length&&jQuery(b).find(".ig_form_required_field").length&&""!==jQuery(b).find(".ig_form_required_field").val()?(a.preventDefault(),void a.data.self.hide()):(a.data.self.track("clicked"),void(jQuery(b).length?jQuery(b).submit(function(a){jQuery(b).hasClass("ig_form_init_done")&&a.preventDefault()}):"string"==typeof a.data.self.data.link&&""!=a.data.self.data.link?(window.location.href=a.data.self.data.link,a.data.self.hide()):a.data.self.data.hide!==!1&&a.data.self.hide()))},Icegram_Message_Type.prototype.animate=function(a){if("undefined"!=typeof this.data.animation){var b=this.data.animation,c=this;"in"==a?"function"==typeof this.animations[b+"_in"]?this.animations[b+"_in"](c):this.el.hasClass("ig_anim_"+b+"_in")||(this.el.removeClass("ig_anim_"+b+"_out"),setTimeout(function(){c.el.addClass("ig_anim_"+b+"_in")},1)):"out"==a&&("function"==typeof this.animations[b+"_out"]?this.animations[b+"_out"](c):(this.el.removeClass("ig_anim_"+b+"_in"),setTimeout(function(){c.el.addClass("ig_anim_"+b+"_out")},1)))}},String.prototype.ucwords=function(){return this.toLowerCase().replace(/\b[a-z]/g,function(a){return a.toUpperCase()})},Icegram.prototype.adjustFormContainerHeight=function(a){var b="";if(a.el.hasClass("ig_form_left")||a.el.hasClass("ig_form_right")){b=a.el.hasClass("ig_form_left")?"left":"right";var c=a.el.find(".ig_data").outerHeight()>a.el.find(".ig_form_container.layout_"+b).outerHeight()?a.el.find(".ig_data").outerHeight():a.el.find(".ig_form_container.layout_"+b).outerHeight();a.el.find(".ig_form_container").outerHeight(c)}},Icegram.prototype.hexToRgb=function(a){var b=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a);return b?{r:parseInt(b[1],16),g:parseInt(b[2],16),b:parseInt(b[3],16)}:null},Icegram.prototype.rgbToHsl=function(a,b,c){a/=255,b/=255,c/=255;var d,e,f=Math.max(a,b,c),g=Math.min(a,b,c),h=(f+g)/2;if(f==g)d=e=0;else{var i=f-g;switch(e=h>.5?i/(2-f-g):i/(f+g),f){case a:d=(b-c)/i;break;case b:d=(c-a)/i+2;break;case c:d=(a-b)/i+4}h=Math.floor(100*h),e=Math.floor(100*e),d=Math.floor(60*d),0>d&&(d+=360)}return{h:d,s:e,l:h}},Icegram.prototype.hexToHsl=function(a){var b=window.icegram.hexToRgb(a);return window.icegram.rgbToHsl(b.r,b.g,b.b)},"function"!=typeof Object.create&&!function(){var a=function(){};Object.create=function(b){if(arguments.length>1)throw Error("Second argument not supported");if(null===b)throw Error("Cannot set a null [[Prototype]]");if("object"!=typeof b)throw TypeError("Argument must be an object");return a.prototype=b,new a}}(),void 0!==typeof jQuery.cookie&&!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}});;function Icegram_Message_Type_Action_Bar(a){Icegram_Message_Type.apply(this,arguments)}Icegram_Message_Type_Action_Bar.prototype=Object.create(Icegram_Message_Type.prototype),Icegram_Message_Type_Action_Bar.prototype.constructor=Icegram_Message_Type_Action_Bar,Icegram_Message_Type_Action_Bar.prototype.get_template_default=function(){return'<div class="icegram action_bar_{{=id}}" ><div class="ig_action_bar ig_container ig_{{=theme}} ig_no_hide" id="icegram_message_{{=id}}"><div class="ig_content ig_clear_fix"><div class="ig_close" id="ig_close_{{=id}}"><span></span></div><div class="ig_form_container layout_left"></div><div class="ig_data ig_clear_fix"><div class="ig_headline">{{=headline}}</div><div class="ig_message">{{=message}}</div></div><div class="ig_button">{{=label}}</div><div class="ig_form_container layout_right layout_bottom"></div></div></div></div>'},Icegram_Message_Type_Action_Bar.prototype.post_render=function(){void 0!=this.data.use_theme_defaults&&"yes"==this.data.use_theme_defaults||void 0!=this.data.bg_color&&""!=this.data.bg_color&&this.el.find(".ig_close").css("background-color",this.data.bg_color),"21"!==this.data.position&&0==jQuery("#ig_body_pushdown").length&&jQuery("body").prepend('<div id="ig_body_pushdown"></div>')},Icegram_Message_Type_Action_Bar.prototype.set_position=function(){switch(this.data.position){case"21":this.el.addClass("ig_bottom");break;case"01":default:this.el.addClass("ig_top")}},Icegram_Message_Type_Action_Bar.prototype.add_powered_by=function(a){this.el.addClass("ig_has_pwby").find(".ig_content").before('<div class="ig_powered_by" ><a href="'+a.link+'" target="_blank"><img src="'+a.logo+'" title="'+a.text+'"/></a></div>')},Icegram_Message_Type_Action_Bar.prototype.on_click=function(a){return a.data=a.data||{self:this},jQuery(a.target).filter(".ig_show .ig_close, .ig_show .ig_close span").length?void a.data.self.hide():jQuery(a.target).filter(".ig_hide .ig_close, .ig_hide .ig_close span").length?void a.data.self.show():void Icegram_Message_Type.prototype.on_click.apply(this,arguments)},Icegram_Message_Type_Action_Bar.prototype.post_show=function(){if("21"!==this.data.position){var a=this.el.outerHeight()||0;jQuery("#ig_body_pushdown").css("display","block").animate({height:a},500),jQuery("*",document.body).not(".ig_action_bar, .ig_popup, .ig_messenger, .ig_inline, .ig_overlay, .ig_sidebar, .ig_tab, .ig_interstitial ,#ig_body_pushdown ").each(function(){var b=window.getComputedStyle(this,null);("fixed"===b.position||"absolute"===b.position&&("BODY"===this.parentNode.nodeName||"HEADER"===this.nodeName))&&!isNaN(parseInt(b.top,10))&&this.getBoundingClientRect().top<=a&&jQuery(this).data("ig_fx_top",b.top).animate({top:parseInt(b.top,10)+a+"px"},300)})}},Icegram_Message_Type_Action_Bar.prototype.pre_hide=function(){"21"!==this.data.position&&(jQuery("#ig_body_pushdown").animate({height:0},300).css("display","none"),jQuery("*",document.body).not(".ig_action_bar, .ig_popup, .ig_messenger, .ig_inline, .ig_overlay, .ig_sidebar, .ig_tab, .ig_interstitial ,#ig_body_pushdown ").each(function(){"undefined"!=typeof jQuery(this).data("ig_fx_top")&&jQuery(this).animate({top:jQuery(this).data("ig_fx_top")},200)}))};;function Icegram_Message_Type_Messenger(a){Icegram_Message_Type.apply(this,arguments)}Icegram_Message_Type_Messenger.prototype=Object.create(Icegram_Message_Type.prototype),Icegram_Message_Type_Messenger.prototype.constructor=Icegram_Message_Type_Messenger,Icegram_Message_Type_Messenger.prototype.get_template_default=function(){return'<div class="icegram ig_messenger ig_{{=theme}} ig_container ig_cta" id="icegram_message_{{=id}}"><div class="ig_content"><div class="ig_close" id="ig_close_{{=id}}"></div><div class="ig_data"><div class="ig_headline">{{=headline}}</div><div class="ig_body"><img class="ig_icon" src="{{=icon}}"/><div class="ig_message">{{=message}}</div></div><div class="ig_footer"></div></div></div></div>'},Icegram_Message_Type_Messenger.prototype.set_position=function(){switch(this.data.position){case"20":this.el.addClass("ig_left ig_bottom");break;case"22":default:this.el.addClass("ig_right ig_bottom")}},Icegram_Message_Type_Messenger.prototype.add_powered_by=function(a){this.el.addClass("ig_has_pwby").find(".ig_content").after('<div class="ig_powered_by"><a href="'+a.link+'" target="_blank">'+a.text+"</a></div>")};;function Icegram_Message_Type_Popup(a){Icegram_Message_Type.apply(this,arguments)}Icegram_Message_Type_Popup.prototype=Object.create(Icegram_Message_Type.prototype),Icegram_Message_Type_Popup.prototype.constructor=Icegram_Message_Type_Popup,Icegram_Message_Type_Popup.prototype.get_template_default=function(){return'<div id="icegram_message_{{=id}}" class="icegram ig_popup ig_{{=theme}} ig_container mfp-hide"><div class="ig_close" id="popup_box_close_{{=id}}"></div><div class="ig_clear_fix" data={{=id}}><div class="ig_bg_overlay"></div><div class="ig_form_container layout_left"></div><div class="ig_data ig_clear_fix"><div class="ig_headline">{{=headline}}</div><div class="ig_content"><div class="ig_message ig_clear_fix">{{=message}}</div></div><div class="ig_button" >{{=label}}</div></div><div class="ig_form_container layout_right layout_bottom"></div></div></div>'},Icegram_Message_Type_Popup.prototype.post_render=function(){void 0!=this.data.use_theme_defaults&&"yes"==this.data.use_theme_defaults||void 0!=this.data.bg_color&&""!=this.data.bg_color&&this.el.find(".ig_bg_overlay").css("border-color",this.data.bg_color)},Icegram_Message_Type_Popup.prototype.show=function(a,b){if(!this.is_visible()){var c=this,d="#icegram_message_"+this.data.id;this.animate("in");var e=jQuery.magnificPopup;e.open({items:{src:d,type:"inline"},showCloseBtn:!1,callbacks:{close:function(){b!==!0&&c.track("closed"),c.el.removeClass("ig_show")},open:function(){window.icegram.adjustFormContainerHeight(c)}}}),c.el.addClass("ig_show").removeClass("ig_hide"),b!==!0&&this.track("shown")}},Icegram_Message_Type_Popup.prototype.add_powered_by=function(a){setTimeout(function(){jQuery(".mfp-wrap").append('<div class="ig_powered_by"><a href="'+a.link+'" target="_blank">'+a.text+"</a></div>")},1e3+1e3*this.data.delay_time)},Icegram_Message_Type_Popup.prototype.hide=function(a,b){if(this.is_visible()){var c="#icegram_message_"+this.data.id,d=this;this.animate("out"),setTimeout(function(){d.el.addClass("ig_hide").removeClass("ig_show"),jQuery.magnificPopup.close({items:{src:c,type:"inline"}})},500)}},"undefined"==typeof jQuery.magnificPopup&&!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):window.jQuery||window.Zepto)}(function(a){var b,c,d,e,f,g,h="Close",i="BeforeClose",j="AfterClose",k="BeforeAppend",l="MarkupParse",m="Open",n="Change",o="mfp",p="."+o,q="mfp-ready",r="mfp-removing",s="mfp-prevent-close",t=function(){},u=!!window.jQuery,v=a(window),w=function(a,c){b.ev.on(o+a+p,c)},x=function(b,c,d,e){var f=document.createElement("div");return f.className="mfp-"+b,d&&(f.innerHTML=d),e?c&&c.appendChild(f):(f=a(f),c&&f.appendTo(c)),f},y=function(c,d){b.ev.triggerHandler(o+c,d),b.st.callbacks&&(c=c.charAt(0).toLowerCase()+c.slice(1),b.st.callbacks[c]&&b.st.callbacks[c].apply(b,a.isArray(d)?d:[d]))},z=function(c){return c===g&&b.currTemplate.closeBtn||(b.currTemplate.closeBtn=a(b.st.closeMarkup.replace("%title%",b.st.tClose)),g=c),b.currTemplate.closeBtn},A=function(){a.magnificPopup.instance||(b=new t,b.init(),a.magnificPopup.instance=b)},B=function(){var a=document.createElement("p").style,b=["ms","O","Moz","Webkit"];if(void 0!==a.transition)return!0;for(;b.length;)if(b.pop()+"Transition"in a)return!0;return!1};t.prototype={constructor:t,init:function(){var c=navigator.appVersion;b.isIE7=-1!==c.indexOf("MSIE 7."),b.isIE8=-1!==c.indexOf("MSIE 8."),b.isLowIE=b.isIE7||b.isIE8,b.isAndroid=/android/gi.test(c),b.isIOS=/iphone|ipad|ipod/gi.test(c),b.supportsTransition=B(),b.probablyMobile=b.isAndroid||b.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),d=a(document),b.popupsCache={}},open:function(c){var e;if(c.isObj===!1){b.items=c.items.toArray(),b.index=0;var g,h=c.items;for(e=0;e<h.length;e++)if(g=h[e],g.parsed&&(g=g.el[0]),g===c.el[0]){b.index=e;break}}else b.items=a.isArray(c.items)?c.items:[c.items],b.index=c.index||0;if(b.isOpen)return void b.updateItemHTML();b.types=[],f="",c.mainEl&&c.mainEl.length?b.ev=c.mainEl.eq(0):b.ev=d,c.key?(b.popupsCache[c.key]||(b.popupsCache[c.key]={}),b.currTemplate=b.popupsCache[c.key]):b.currTemplate={},b.st=a.extend(!0,{},a.magnificPopup.defaults,c),b.fixedContentPos="auto"===b.st.fixedContentPos?!b.probablyMobile:b.st.fixedContentPos,b.st.modal&&(b.st.closeOnContentClick=!1,b.st.closeOnBgClick=!1,b.st.showCloseBtn=!1,b.st.enableEscapeKey=!1),b.bgOverlay||(b.bgOverlay=x("bg").on("click"+p,function(){b.close()}),b.wrap=x("wrap").attr("tabindex",-1).on("click"+p,function(a){b._checkIfClose(a.target)&&b.close()}),b.container=x("container",b.wrap)),b.contentContainer=x("content"),b.st.preloader&&(b.preloader=x("preloader",b.container,b.st.tLoading));var i=a.magnificPopup.modules;for(e=0;e<i.length;e++){var j=i[e];j=j.charAt(0).toUpperCase()+j.slice(1),b["init"+j].call(b)}y("BeforeOpen"),b.st.showCloseBtn&&(b.st.closeBtnInside?(w(l,function(a,b,c,d){c.close_replaceWith=z(d.type)}),f+=" mfp-close-btn-in"):b.wrap.append(z())),b.st.alignTop&&(f+=" mfp-align-top"),b.fixedContentPos?b.wrap.css({overflow:b.st.overflowY,overflowX:"hidden",overflowY:b.st.overflowY}):b.wrap.css({top:v.scrollTop(),position:"absolute"}),(b.st.fixedBgPos===!1||"auto"===b.st.fixedBgPos&&!b.fixedContentPos)&&b.bgOverlay.css({height:d.height(),position:"absolute"}),b.st.enableEscapeKey&&d.on("keyup"+p,function(a){27===a.keyCode&&b.close()}),v.on("resize"+p,function(){b.updateSize()}),b.st.closeOnContentClick||(f+=" mfp-auto-cursor"),f&&b.wrap.addClass(f);var k=b.wH=v.height(),n={};if(b.fixedContentPos&&b._hasScrollBar(k)){var o=b._getScrollbarSize();o&&(n.marginRight=o)}b.fixedContentPos&&(b.isIE7?a("body, html").css("overflow","hidden"):n.overflow="hidden");var r=b.st.mainClass;return b.isIE7&&(r+=" mfp-ie7"),r&&b._addClassToMFP(r),b.updateItemHTML(),y("BuildControls"),a("html").css(n),b.bgOverlay.add(b.wrap).prependTo(b.st.prependTo||a(document.body)),b._lastFocusedEl=document.activeElement,setTimeout(function(){b.content?(b._addClassToMFP(q),b._setFocus()):b.bgOverlay.addClass(q),d.on("focusin"+p,b._onFocusIn)},16),b.isOpen=!0,b.updateSize(k),y(m),c},close:function(){b.isOpen&&(y(i),b.isOpen=!1,b.st.removalDelay&&!b.isLowIE&&b.supportsTransition?(b._addClassToMFP(r),setTimeout(function(){b._close()},b.st.removalDelay)):b._close())},_close:function(){y(h);var c=r+" "+q+" ";if(b.bgOverlay.detach(),b.wrap.detach(),b.container.empty(),b.st.mainClass&&(c+=b.st.mainClass+" "),b._removeClassFromMFP(c),b.fixedContentPos){var e={marginRight:""};b.isIE7?a("body, html").css("overflow",""):e.overflow="",a("html").css(e)}d.off("keyup"+p+" focusin"+p),b.ev.off(p),b.wrap.attr("class","mfp-wrap").removeAttr("style"),b.bgOverlay.attr("class","mfp-bg"),b.container.attr("class","mfp-container"),b.st.showCloseBtn&&(!b.st.closeBtnInside||b.currTemplate[b.currItem.type]===!0)&&b.currTemplate.closeBtn&&b.currTemplate.closeBtn.detach(),b._lastFocusedEl&&a(b._lastFocusedEl).focus(),b.currItem=null,b.content=null,b.currTemplate=null,b.prevHeight=0,y(j)},updateSize:function(a){if(b.isIOS){var c=document.documentElement.clientWidth/window.innerWidth,d=window.innerHeight*c;b.wrap.css("height",d),b.wH=d}else b.wH=a||v.height();b.fixedContentPos||b.wrap.css("height",b.wH),y("Resize")},updateItemHTML:function(){var c=b.items[b.index];b.contentContainer.detach(),b.content&&b.content.detach(),c.parsed||(c=b.parseEl(b.index));var d=c.type;if(y("BeforeChange",[b.currItem?b.currItem.type:"",d]),b.currItem=c,!b.currTemplate[d]){var f=b.st[d]?b.st[d].markup:!1;y("FirstMarkupParse",f),f?b.currTemplate[d]=a(f):b.currTemplate[d]=!0}e&&e!==c.type&&b.container.removeClass("mfp-"+e+"-holder");var g=b["get"+d.charAt(0).toUpperCase()+d.slice(1)](c,b.currTemplate[d]);b.appendContent(g,d),c.preloaded=!0,y(n,c),e=c.type,b.container.prepend(b.contentContainer),y("AfterChange")},appendContent:function(a,c){b.content=a,a?b.st.showCloseBtn&&b.st.closeBtnInside&&b.currTemplate[c]===!0?b.content.find(".mfp-close").length||b.content.append(z()):b.content=a:b.content="",y(k),b.container.addClass("mfp-"+c+"-holder"),b.contentContainer.append(b.content)},parseEl:function(c){var d,e=b.items[c];if(e.tagName?e={el:a(e)}:(d=e.type,e={data:e,src:e.src}),e.el){for(var f=b.types,g=0;g<f.length;g++)if(e.el.hasClass("mfp-"+f[g])){d=f[g];break}e.src=e.el.attr("data-mfp-src"),e.src||(e.src=e.el.attr("href"))}return e.type=d||b.st.type||"inline",e.index=c,e.parsed=!0,b.items[c]=e,y("ElementParse",e),b.items[c]},addGroup:function(a,c){var d=function(d){d.mfpEl=this,b._openClick(d,a,c)};c||(c={});var e="click.magnificPopup";c.mainEl=a,c.items?(c.isObj=!0,a.off(e).on(e,d)):(c.isObj=!1,c.delegate?a.off(e).on(e,c.delegate,d):(c.items=a,a.off(e).on(e,d)))},_openClick:function(c,d,e){var f=void 0!==e.midClick?e.midClick:a.magnificPopup.defaults.midClick;if(f||2!==c.which&&!c.ctrlKey&&!c.metaKey){var g=void 0!==e.disableOn?e.disableOn:a.magnificPopup.defaults.disableOn;if(g)if(a.isFunction(g)){if(!g.call(b))return!0}else if(v.width()<g)return!0;c.type&&(c.preventDefault(),b.isOpen&&c.stopPropagation()),e.el=a(c.mfpEl),e.delegate&&(e.items=d.find(e.delegate)),b.open(e)}},updateStatus:function(a,d){if(b.preloader){c!==a&&b.container.removeClass("mfp-s-"+c),!d&&"loading"===a&&(d=b.st.tLoading);var e={status:a,text:d};y("UpdateStatus",e),a=e.status,d=e.text,b.preloader.html(d),b.preloader.find("a").on("click",function(a){a.stopImmediatePropagation()}),b.container.addClass("mfp-s-"+a),c=a}},_checkIfClose:function(c){if(!a(c).hasClass(s)){var d=b.st.closeOnContentClick,e=b.st.closeOnBgClick;if(d&&e)return!0;if(!b.content||a(c).hasClass("mfp-close")||b.preloader&&c===b.preloader[0])return!0;if(c===b.content[0]||a.contains(b.content[0],c)){if(d)return!0}else if(e&&a.contains(document,c))return!0;return!1}},_addClassToMFP:function(a){b.bgOverlay.addClass(a),b.wrap.addClass(a)},_removeClassFromMFP:function(a){this.bgOverlay.removeClass(a),b.wrap.removeClass(a)},_hasScrollBar:function(a){return(b.isIE7?d.height():document.body.scrollHeight)>(a||v.height())},_setFocus:function(){(b.st.focus?b.content.find(b.st.focus).eq(0):b.wrap).focus()},_onFocusIn:function(c){return c.target===b.wrap[0]||a.contains(b.wrap[0],c.target)?void 0:(b._setFocus(),!1)},_parseMarkup:function(b,c,d){var e;d.data&&(c=a.extend(d.data,c)),y(l,[b,c,d]),a.each(c,function(a,c){if(void 0===c||c===!1)return!0;if(e=a.split("_"),e.length>1){var d=b.find(p+"-"+e[0]);if(d.length>0){var f=e[1];"replaceWith"===f?d[0]!==c[0]&&d.replaceWith(c):"img"===f?d.is("img")?d.attr("src",c):d.replaceWith('<img src="'+c+'" class="'+d.attr("class")+'" />'):d.attr(e[1],c)}}else b.find(p+"-"+a).html(c)})},_getScrollbarSize:function(){if(void 0===b.scrollbarSize){var a=document.createElement("div");a.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(a),b.scrollbarSize=a.offsetWidth-a.clientWidth,document.body.removeChild(a)}return b.scrollbarSize}},a.magnificPopup={instance:null,proto:t.prototype,modules:[],open:function(b,c){return A(),b=b?a.extend(!0,{},b):{},b.isObj=!0,b.index=c||0,this.instance.open(b)},close:function(){return a.magnificPopup.instance&&a.magnificPopup.instance.close()},registerModule:function(b,c){c.options&&(a.magnificPopup.defaults[b]=c.options),a.extend(this.proto,c.proto),this.modules.push(b)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'<button title="%title%" type="button" class="mfp-close">&times;</button>',tClose:"Close (Esc)",tLoading:"Loading..."}},a.fn.magnificPopup=function(c){A();var d=a(this);if("string"==typeof c)if("open"===c){var e,f=u?d.data("magnificPopup"):d[0].magnificPopup,g=parseInt(arguments[1],10)||0;f.items?e=f.items[g]:(e=d,f.delegate&&(e=e.find(f.delegate)),e=e.eq(g)),b._openClick({mfpEl:e},d,f)}else b.isOpen&&b[c].apply(b,Array.prototype.slice.call(arguments,1));else c=a.extend(!0,{},c),u?d.data("magnificPopup",c):d[0].magnificPopup=c,b.addGroup(d,c);return d};var C,D,E,F="inline",G=function(){E&&(D.after(E.addClass(C)).detach(),E=null)};a.magnificPopup.registerModule(F,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){b.types.push(F),w(h+"."+F,function(){G()})},getInline:function(c,d){if(G(),c.src){var e=b.st.inline,f=a(c.src);if(f.length){var g=f[0].parentNode;g&&g.tagName&&(D||(C=e.hiddenClass,D=x(C),C="mfp-"+C),E=f.after(D).detach().removeClass(C)),b.updateStatus("ready")}else b.updateStatus("error",e.tNotFound),f=a("<div>");return c.inlineElement=f,f}return b.updateStatus("ready"),b._parseMarkup(d,{},c),d}}});var H,I=function(c){if(c.data&&void 0!==c.data.title)return c.data.title;var d=b.st.image.titleSrc;if(d){if(a.isFunction(d))return d.call(b,c);if(c.el)return c.el.attr(d)||""}return""};a.magnificPopup.registerModule("image",{options:{markup:'<div class="mfp-figure"><div class="mfp-close"></div><figure><div class="mfp-img"></div><figcaption><div class="mfp-bottom-bar"><div class="mfp-title"></div><div class="mfp-counter"></div></div></figcaption></figure></div>',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'<a href="%url%">The image</a> could not be loaded.'},proto:{initImage:function(){var c=b.st.image,d=".image";b.types.push("image"),w(m+d,function(){"image"===b.currItem.type&&c.cursor&&a(document.body).addClass(c.cursor)}),w(h+d,function(){c.cursor&&a(document.body).removeClass(c.cursor),v.off("resize"+p)}),w("Resize"+d,b.resizeImage),b.isLowIE&&w("AfterChange",b.resizeImage)},resizeImage:function(){var a=b.currItem;if(a&&a.img&&b.st.image.verticalFit){var c=0;b.isLowIE&&(c=parseInt(a.img.css("padding-top"),10)+parseInt(a.img.css("padding-bottom"),10)),a.img.css("max-height",b.wH-c)}},_onImageHasSize:function(a){a.img&&(a.hasSize=!0,H&&clearInterval(H),a.isCheckingImgSize=!1,y("ImageHasSize",a),a.imgHidden&&(b.content&&b.content.removeClass("mfp-loading"),a.imgHidden=!1))},findImageSize:function(a){var c=0,d=a.img[0],e=function(f){H&&clearInterval(H),H=setInterval(function(){return d.naturalWidth>0?void b._onImageHasSize(a):(c>200&&clearInterval(H),c++,3===c?e(10):40===c?e(50):100===c&&e(500),void 0)},f)};e(1)},getImage:function(c,d){var e=0,f=function(){c&&(c.img[0].complete?(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("ready")),c.hasSize=!0,c.loaded=!0,y("ImageLoadComplete")):(e++,200>e?setTimeout(f,100):g()))},g=function(){c&&(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("error",h.tError.replace("%url%",c.src))),c.hasSize=!0,c.loaded=!0,c.loadError=!0)},h=b.st.image,i=d.find(".mfp-img");if(i.length){var j=document.createElement("img");j.className="mfp-img",c.el&&c.el.find("img").length&&(j.alt=c.el.find("img").attr("alt")),c.img=a(j).on("load.mfploader",f).on("error.mfploader",g),j.src=c.src,i.is("img")&&(c.img=c.img.clone()),j=c.img[0],j.naturalWidth>0?c.hasSize=!0:j.width||(c.hasSize=!1)}return b._parseMarkup(d,{title:I(c),img_replaceWith:c.img},c),b.resizeImage(),c.hasSize?(H&&clearInterval(H),c.loadError?(d.addClass("mfp-loading"),b.updateStatus("error",h.tError.replace("%url%",c.src))):(d.removeClass("mfp-loading"),b.updateStatus("ready")),d):(b.updateStatus("loading"),c.loading=!0,c.hasSize||(c.imgHidden=!0,d.addClass("mfp-loading"),b.findImageSize(c)),d)}}});var J,K=function(){return void 0===J&&(J=void 0!==document.createElement("p").style.MozTransform),J};a.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(a){return a.is("img")?a:a.find("img")}},proto:{initZoom:function(){var a,c=b.st.zoom,d=".zoom";if(c.enabled&&b.supportsTransition){var e,f,g=c.duration,j=function(a){var b=a.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),d="all "+c.duration/1e3+"s "+c.easing,e={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},f="transition";return e["-webkit-"+f]=e["-moz-"+f]=e["-o-"+f]=e[f]=d,b.css(e),b},k=function(){b.content.css("visibility","visible")};w("BuildControls"+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.content.css("visibility","hidden"),a=b._getItemToZoom(),!a)return void k();f=j(a),f.css(b._getOffset()),b.wrap.append(f),e=setTimeout(function(){f.css(b._getOffset(!0)),e=setTimeout(function(){k(),setTimeout(function(){f.remove(),a=f=null,y("ZoomAnimationEnded")},16)},g)},16)}}),w(i+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.st.removalDelay=g,!a){if(a=b._getItemToZoom(),!a)return;f=j(a)}f.css(b._getOffset(!0)),b.wrap.append(f),b.content.css("visibility","hidden"),setTimeout(function(){f.css(b._getOffset())},16)}}),w(h+d,function(){b._allowZoom()&&(k(),f&&f.remove(),a=null)})}},_allowZoom:function(){return"image"===b.currItem.type},_getItemToZoom:function(){return b.currItem.hasSize?b.currItem.img:!1},_getOffset:function(c){var d;d=c?b.currItem.img:b.st.zoom.opener(b.currItem.el||b.currItem);var e=d.offset(),f=parseInt(d.css("padding-top"),10),g=parseInt(d.css("padding-bottom"),10);e.top-=a(window).scrollTop()-f;var h={width:d.width(),height:(u?d.innerHeight():d[0].offsetHeight)-g-f};return K()?h["-moz-transform"]=h.transform="translate("+e.left+"px,"+e.top+"px)":(h.left=e.left,h.top=e.top),h}}});var L="retina";a.magnificPopup.registerModule(L,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=b.st.retina,c=a.ratio;c=isNaN(c)?c():c,c>1&&(w("ImageHasSize."+L,function(a,b){b.img.css({"max-width":b.img[0].naturalWidth/c,width:"100%"})}),w("ElementParse."+L,function(b,d){d.src=a.replaceSrc(d,c)}))}}}}),A()});;function Icegram_Message_Type_Toast(a){this.width=300,this.sticky=!1,this.duration=1e4,Icegram_Message_Type.apply(this,arguments)}Icegram_Message_Type_Toast.prototype=Object.create(Icegram_Message_Type.prototype),Icegram_Message_Type_Toast.prototype.constructor=Icegram_Message_Type_Toast,Icegram_Message_Type_Toast.prototype.get_template_default=function(){return'<li class="icegram ig_toast ig_container ig_{{=theme}} ig_cta" data="{{=id}}" id="icegram_message_{{=id}}"><div class="ig_wrapper"><div class="ig_content"><div class="ig_base"></div><div class="ig_line"></div><img class="ig_icon" src="{{=icon}}"/><div class="ig_headline">{{=headline}}</div><div class="ig_message">{{=message}}</div></div></div></li>'},Icegram_Message_Type_Toast.prototype.pre_render=function(){if("10"!=this.data.position&&"12"!=this.data.position||(this.data.position="20"),jQuery("ul#"+this.data.position).length)var a=jQuery("ul#"+this.data.position);else{var a=jQuery('<ul id="'+this.data.position+'"></ul>').addClass("ig_toast_block").appendTo(this.root_container).hide();a.width(this.width),"00"==this.data.position?a.css({top:"0",left:"0"}).addClass("ig_left").addClass("ig_top"):"01"==this.data.position?a.css({top:"0",left:"50%",margin:"5px 0 0 -"+this.width/2+"px"}).addClass("ig_center").addClass("ig_top"):"02"==this.data.position?a.css({top:"0",right:"0"}).addClass("ig_right").addClass("ig_top"):"20"==this.data.position?a.css({bottom:"0",left:"0"}).addClass("ig_left").addClass("ig_bottom"):"21"==this.data.position?a.css({bottom:"0",left:"50%",margin:"5px 0 0 -"+this.width/2+"px"}).addClass("ig_center").addClass("ig_bottom"):"22"==this.data.position?a.css({bottom:"0",right:"0"}).addClass("ig_right").addClass("ig_bottom"):"11"==this.data.position&&a.css({top:"50%",left:"50%",margin:"-"+this.width/2+"px 0 0 -"+this.width/2+"px"}).addClass("ig_center").addClass("ig_top")}this.root_container=a},Icegram_Message_Type_Toast.prototype.pre_show=function(){!this.root_container.hasClass("active")&&this.root_container.addClass("active").show()},Icegram_Message_Type_Toast.prototype.post_show=function(){var a=this;!this.sticky&&this.duration>0&&setTimeout(function(){a.hide(),a.root_container.children().length||a.root_container.removeClass("active").hide()},this.duration)};
classes/ig-mobile-detect.php CHANGED
@@ -22,1409 +22,1437 @@
22
  * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md
23
  * HOWTO: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples
24
  *
25
- * @version 2.8.15
26
  */
27
- if ( !class_exists( 'Ig_Mobile_Detect' ) )
 
28
  {
29
- class Ig_Mobile_Detect
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  {
31
- /**
32
- * Mobile detection type.
33
- *
34
- * @deprecated since version 2.6.9
35
- */
36
- const DETECTION_TYPE_MOBILE = 'mobile';
37
-
38
- /**
39
- * Extended detection type.
40
- *
41
- * @deprecated since version 2.6.9
42
- */
43
- const DETECTION_TYPE_EXTENDED = 'extended';
44
-
45
- /**
46
- * A frequently used regular expression to extract version #s.
47
- *
48
- * @deprecated since version 2.6.9
49
- */
50
- const VER = '([\w._\+]+)';
51
-
52
- /**
53
- * Top-level device.
54
- */
55
- const MOBILE_GRADE_A = 'A';
56
-
57
- /**
58
- * Mid-level device.
59
- */
60
- const MOBILE_GRADE_B = 'B';
61
-
62
- /**
63
- * Low-level device.
64
- */
65
- const MOBILE_GRADE_C = 'C';
66
-
67
- /**
68
- * Stores the version number of the current release.
69
- */
70
- const VERSION = '2.8.15';
71
-
72
- /**
73
- * A type for the version() method indicating a string return value.
74
- */
75
- const VERSION_TYPE_STRING = 'text';
76
-
77
- /**
78
- * A type for the version() method indicating a float return value.
79
- */
80
- const VERSION_TYPE_FLOAT = 'float';
81
-
82
- /**
83
- * A cache for resolved matches
84
- * @var array
85
- */
86
- protected $cache = array();
87
-
88
- /**
89
- * The User-Agent HTTP header is stored in here.
90
- * @var string
91
- */
92
- protected $userAgent = null;
93
-
94
- /**
95
- * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE.
96
- * @var array
97
- */
98
- protected $httpHeaders = array();
99
-
100
- /**
101
- * CloudFront headers. E.g. CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer & CloudFront-Is-Tablet-Viewer.
102
- * @var array
103
- */
104
- protected $cloudfrontHeaders = array();
105
-
106
- /**
107
- * The matching Regex.
108
- * This is good for debug.
109
- * @var string
110
- */
111
- protected $matchingRegex = null;
112
-
113
- /**
114
- * The matches extracted from the regex expression.
115
- * This is good for debug.
116
- * @var string
117
- */
118
- protected $matchesArray = null;
119
-
120
- /**
121
- * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED.
122
- *
123
- * @deprecated since version 2.6.9
124
- *
125
- * @var string
126
- */
127
- protected $detectionType = self::DETECTION_TYPE_MOBILE;
128
-
129
- /**
130
- * HTTP headers that trigger the 'isMobile' detection
131
- * to be true.
132
- *
133
- * @var array
134
- */
135
- protected static $mobileHeaders = array(
136
-
137
- 'HTTP_ACCEPT' => array('matches' => array(
138
- // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/
139
- 'application/x-obml2d',
140
- // BlackBerry devices.
141
- 'application/vnd.rim.html',
142
- 'text/vnd.wap.wml',
143
- 'application/vnd.wap.xhtml+xml'
144
- )),
145
- 'HTTP_X_WAP_PROFILE' => null,
146
- 'HTTP_X_WAP_CLIENTID' => null,
147
- 'HTTP_WAP_CONNECTION' => null,
148
- 'HTTP_PROFILE' => null,
149
- // Reported by Opera on Nokia devices (eg. C3).
150
- 'HTTP_X_OPERAMINI_PHONE_UA' => null,
151
- 'HTTP_X_NOKIA_GATEWAY_ID' => null,
152
- 'HTTP_X_ORANGE_ID' => null,
153
- 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null,
154
- 'HTTP_X_HUAWEI_USERID' => null,
155
- // Reported by Windows Smartphones.
156
- 'HTTP_UA_OS' => null,
157
- // Reported by Verizon, Vodafone proxy system.
158
- 'HTTP_X_MOBILE_GATEWAY' => null,
159
- // Seen this on HTC Sensation. SensationXE_Beats_Z715e.
160
- 'HTTP_X_ATT_DEVICEID' => null,
161
- // Seen this on a HTC.
162
- 'HTTP_UA_CPU' => array('matches' => array('ARM')),
163
- );
164
-
165
- /**
166
- * List of mobile devices (phones).
167
- *
168
- * @var array
169
- */
170
- protected static $phoneDevices = array(
171
- 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes
172
- 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+',
173
- 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m',
174
- 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6',
175
- // @todo: Is 'Dell Streak' a tablet or a phone? ;)
176
- 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b',
177
- 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b',
178
- 'Samsung' => 'Samsung|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205',
179
- 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)',
180
- 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533',
181
- 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile',
182
- // http://www.micromaxinfo.com/mobiles/smartphones
183
- // Added because the codes might conflict with Acer Tablets.
184
- 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b',
185
- // @todo Complete the regex.
186
- 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ;
187
- 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;)
188
- // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH)
189
- // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android.
190
- 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790',
191
- // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones.
192
- 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250',
193
- // http://fr.wikomobile.com
194
- 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM',
195
- 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)',
196
- // Added simvalley mobile just for fun. They have some interesting devices.
197
- // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html
198
- 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b',
199
- // Wolfgang - a brand that is sold by Aldi supermarkets.
200
- // http://www.wolfgangmobile.com/
201
- 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q',
202
- 'Alcatel' => 'Alcatel',
203
- 'Nintendo' => 'Nintendo 3DS',
204
- // http://en.wikipedia.org/wiki/Amoi
205
- 'Amoi' => 'Amoi',
206
- // http://en.wikipedia.org/wiki/INQ
207
- 'INQ' => 'INQ',
208
- // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039
209
- 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser',
210
- );
211
-
212
- /**
213
- * List of tablet devices.
214
- *
215
- * @var array
216
- */
217
- protected static $tabletDevices = array(
218
- 'iPad' => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic.
219
- 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)|^.*Android.*Nexus(?:(?!Mobile).)*$',
220
- 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone.
221
- // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html
222
- 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\b',
223
- // Only the Surface tablets with Windows RT are considered mobile.
224
- // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx
225
- 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)',
226
- // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT
227
- 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10',
228
- // Watch out for PadFone, see #132.
229
- // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/
230
- 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K017 |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C',
231
- 'BlackBerryTablet' => 'PlayBook|RIM Tablet',
232
- 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410',
233
- 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617',
234
- 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2',
235
- // http://www.acer.ro/ac/ro/RO/content/drivers
236
- // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer)
237
- // http://us.acer.com/ac/en/US/content/group/tablets
238
- // http://www.acer.de/ac/de/DE/content/models/tablets/
239
- // Can conflict with Micromax and Motorola phones codes.
240
- 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b',
241
- // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/
242
- // http://us.toshiba.com/tablets/tablet-finder
243
- // http://www.toshiba.co.jp/regza/tablet/
244
- 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO',
245
- // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html
246
- // http://www.lg.com/us/tablets
247
- 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b',
248
- 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b',
249
- // Prestigio Tablets http://www.prestigio.com/support
250
- 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD',
251
- // http://support.lenovo.com/en_GB/downloads/default.page?#
252
- 'LenovoTablet' => 'Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)',
253
- // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets
254
- 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7',
255
- // http://www.yarvik.com/en/matrix/tablets/
256
- 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b',
257
- 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB',
258
- 'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2',
259
- // http://www.intenso.de/kategorie_en.php?kategorie=33
260
- // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate
261
- 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004',
262
- // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/
263
- 'IRUTablet' => 'M702pro',
264
- 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b',
265
- // http://www.e-boda.ro/tablete-pc.html
266
- 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)',
267
- // http://www.allview.ro/produse/droseries/lista-tablete-pc/
268
- 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)',
269
- // http://wiki.archosfans.com/index.php?title=Main_Page
270
- 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b',
271
- // http://www.ainol.com/plugin.php?identifier=ainol&module=product
272
- 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark',
273
- // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER
274
- // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser
275
- // http://www.sony.jp/support/tablet/
276
- 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612',
277
- // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8
278
- 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b',
279
- // db + http://www.cube-tablet.com/buy-products.html
280
- 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT',
281
- // http://www.cobyusa.com/?p=pcat&pcat_id=3001
282
- 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010',
283
- // http://www.match.net.cn/products.asp
284
- 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733',
285
- // http://www.msi.com/support
286
- // @todo Research the Windows Tablets.
287
- 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b',
288
- // @todo http://www.kyoceramobile.com/support/drivers/
289
- // 'KyoceraTablet' => null,
290
- // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/
291
- // 'IntextTablet' => null,
292
- // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets)
293
- // http://www.imp3.net/14/show.php?itemid=20454
294
- 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)',
295
- // http://www.rock-chips.com/index.php?do=prod&pid=2
296
- 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A',
297
- // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/
298
- 'FlyTablet' => 'IQ310|Fly Vision',
299
- // http://www.bqreaders.com/gb/tablets-prices-sale.html
300
- 'bqTablet' => '(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus',
301
- // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290
302
- // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets)
303
- 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim',
304
- // Nec or Medias Tab
305
- 'NecTablet' => '\bN-06D|\bN-08D',
306
- // Pantech Tablets: http://www.pantechusa.com/phones/
307
- 'PantechTablet' => 'Pantech.*P4100',
308
- // Broncho Tablets: http://www.broncho.cn/ (hard to find)
309
- 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)',
310
- // http://versusuk.com/support.html
311
- 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b',
312
- // http://www.zync.in/index.php/our-products/tablet-phablets
313
- 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900',
314
- // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
315
- 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA',
316
- // https://www.nabitablet.com/
317
- 'NabiTablet' => 'Android.*\bNabi',
318
- 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build',
319
- // French Danew Tablets http://www.danew.com/produits-tablette.php
320
- 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b',
321
- // Texet Tablets and Readers http://www.texet.ru/tablet/
322
- 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE',
323
- // Avoid detecting 'PLAYSTATION 3' as mobile.
324
- 'PlaystationTablet' => 'Playstation.*(Portable|Vita)',
325
- // http://www.trekstor.de/surftabs.html
326
- 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab',
327
- // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets
328
- 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b',
329
- // http://www.advandigital.com/index.php?link=content-product&jns=JP001
330
- // because of the short codenames we have to include whitespaces to reduce the possible conflicts.
331
- 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ',
332
- // http://www.danytech.com/category/tablet-pc
333
- 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1',
334
- // http://www.galapad.net/product.html
335
- 'GalapadTablet' => 'Android.*\bG1\b',
336
- // http://www.micromaxinfo.com/tablet/funbook
337
- 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b',
338
- // http://www.karbonnmobiles.com/products_tablet.php
339
- 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b',
340
- // http://www.myallfine.com/Products.asp
341
- 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide',
342
- // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
343
- 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b',
344
- // http://www.yonesnav.com/products/products.php
345
- 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026',
346
- // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001
347
- // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html)
348
- 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503',
349
- // http://www.gloryunion.cn/products.asp
350
- // http://www.allwinnertech.com/en/apply/mobile.html
351
- // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB)
352
- // @todo: Softwiner tablets?
353
- // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions.
354
- 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G
355
- // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118
356
- 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10',
357
- // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/
358
- // @todo: add more tests.
359
- 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)',
360
- // http://hclmetablet.com/India/index.php
361
- 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync',
362
- // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html
363
- 'DPSTablet' => 'DPS Dream 9|DPS Dual 7',
364
- // http://www.visture.com/index.asp
365
- 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10',
366
- // http://www.mijncresta.nl/tablet
367
- 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989',
368
- // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309
369
- 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b',
370
- // Concorde tab
371
- 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan',
372
- // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/
373
- 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042',
374
- // Modecom Tablets - http://www.modecom.eu/tablets/portal/
375
- 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003',
376
- // Vonino Tablets - http://www.vonino.eu/tablets
377
- 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b',
378
- // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0
379
- 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1',
380
- // Storex Tablets - http://storex.fr/espace_client/support.html
381
- // @note: no need to add all the tablet codes since they are guided by the first regex.
382
- 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab',
383
- // Generic Vodafone tablets.
384
- 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7',
385
- // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb
386
- // Aka: http://www.essentielb.fr/
387
- 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2',
388
- // Ross & Moor - http://ross-moor.ru/
389
- 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711',
390
- // i-mobile http://product.i-mobilephone.com/Mobile_Device
391
- 'iMobileTablet' => 'i-mobile i-note',
392
- // http://www.tolino.de/de/vergleichen/
393
- 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine',
394
- // AudioSonic - a Kmart brand
395
- // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72&currentPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1
396
- 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b',
397
- // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/
398
- // @todo: add them gradually to avoid conflicts.
399
- 'AMPETablet' => 'Android.* A78 ',
400
- // Skk Mobile - http://skkmobile.com.ph/product_tablets.php
401
- 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)',
402
- // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1
403
- 'TecnoTablet' => 'TECNO P9',
404
- // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3
405
- 'JXDTablet' => 'Android.*\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b',
406
- // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/
407
- 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)',
408
- // http://www.intracon.eu/tablet
409
- 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10',
410
- // http://www.xoro.de/produkte/
411
- // @note: Might be the same brand with 'Simply tablets'
412
- 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151',
413
- // http://www1.viewsonic.com/products/computing/tablets/
414
- 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a',
415
- // http://www.odys.de/web/internet-tablet_en.html
416
- 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10',
417
- // http://www.captiva-power.de/products.html#tablets-en
418
- 'CaptivaTablet' => 'CAPTIVA PAD',
419
- // IconBIT - http://www.iconbit.com/products/tablets/
420
- 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S',
421
- // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63
422
- 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi',
423
- // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price
424
- 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+',
425
- 'JaytechTablet' => 'TPC-PA762',
426
- 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010',
427
- // http://www.digma.ru/support/download/
428
- // @todo: Ebooks also (if requested)
429
- 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b',
430
- // http://www.evolioshop.com/ro/tablete-pc.html
431
- // http://www.evolio.ro/support/downloads_static.html?cat=2
432
- // @todo: Research some more
433
- 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b',
434
- // @todo http://www.lavamobiles.com/tablets-data-cards
435
- 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b',
436
- // https://www.celkonmobiles.com/?_a=categoryphones&sid=2
437
- 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b',
438
- // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab
439
- 'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b',
440
- // http://www.mi.com/en
441
- 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b',
442
- // http://www.nbru.cn/index.html
443
- 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One',
444
- // http://navroad.com/products/produkty/tablety/
445
- 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI',
446
- // http://www.datawind.com/ubislate/
447
- 'UbislateTablet' => 'UbiSlate[\s]?7C',
448
- // http://www.pocketbook-int.com/ru/support
449
- 'PocketBookTablet' => 'Pocketbook',
450
- // http://www.tesco.com/direct/hudl/
451
- 'Hudl' => 'Hudl HT7S3',
452
- // http://www.telstra.com.au/home-phone/thub-2/
453
- 'TelstraTablet' => 'T-Hub2',
454
- 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bJolla\b'
455
- );
456
-
457
- /**
458
- * List of mobile Operating Systems.
459
- *
460
- * @var array
461
- */
462
- protected static $operatingSystems = array(
463
- 'AndroidOS' => 'Android',
464
- 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os',
465
- 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino',
466
- 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b',
467
- // @reference: http://en.wikipedia.org/wiki/Windows_Mobile
468
- 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;',
469
- // @reference: http://en.wikipedia.org/wiki/Windows_Phone
470
- // http://wifeng.cn/?r=blog&a=view&id=106
471
- // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx
472
- // http://msdn.microsoft.com/library/ms537503.aspx
473
- 'WindowsPhoneOS' => 'Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;',
474
- 'iOS' => '\biPhone.*Mobile|\biPod|\biPad',
475
- // http://en.wikipedia.org/wiki/MeeGo
476
- // @todo: research MeeGo in UAs
477
- 'MeeGoOS' => 'MeeGo',
478
- // http://en.wikipedia.org/wiki/Maemo
479
- // @todo: research Maemo in UAs
480
- 'MaemoOS' => 'Maemo',
481
- 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135
482
- 'webOS' => 'webOS|hpwOS',
483
- 'badaOS' => '\bBada\b',
484
- 'BREWOS' => 'BREW',
485
- );
486
-
487
- /**
488
- * List of mobile User Agents.
489
- *
490
- * @var array
491
- */
492
- protected static $browsers = array(
493
- // @reference: https://developers.google.com/chrome/mobile/docs/user-agent
494
- 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?',
495
- 'Dolfin' => '\bDolfin\b',
496
- 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+',
497
- 'Skyfire' => 'Skyfire',
498
- 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+
499
- 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile',
500
- 'Bolt' => 'bolt',
501
- 'TeaShark' => 'teashark',
502
- 'Blazer' => 'Blazer',
503
- // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3
504
- 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari',
505
- // http://en.wikipedia.org/wiki/Midori_(web_browser)
506
- //'Midori' => 'midori',
507
- 'Tizen' => 'Tizen',
508
- 'UCBrowser' => 'UC.*Browser|UCWEB',
509
- 'baiduboxapp' => 'baiduboxapp',
510
- 'baidubrowser' => 'baidubrowser',
511
- // https://github.com/serbanghita/Mobile-Detect/issues/7
512
- 'DiigoBrowser' => 'DiigoBrowser',
513
- // http://www.puffinbrowser.com/index.php
514
- 'Puffin' => 'Puffin',
515
- // http://mercury-browser.com/index.html
516
- 'Mercury' => '\bMercury\b',
517
- // http://en.wikipedia.org/wiki/Obigo_Browser
518
- 'ObigoBrowser' => 'Obigo',
519
- // http://en.wikipedia.org/wiki/NetFront
520
- 'NetFront' => 'NF-Browser',
521
- // @reference: http://en.wikipedia.org/wiki/Minimo
522
- // http://en.wikipedia.org/wiki/Vision_Mobile_Browser
523
- 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger',
524
- );
525
-
526
- /**
527
- * Utilities.
528
- *
529
- * @var array
530
- */
531
- protected static $utilities = array(
532
- // Experimental. When a mobile device wants to switch to 'Desktop Mode'.
533
- // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/
534
- // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011
535
- // https://developers.facebook.com/docs/sharing/best-practices
536
- 'Bot' => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor',
537
- 'MobileBot' => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2',
538
- 'DesktopMode' => 'WPDesktop',
539
- 'TV' => 'SonyDTV|HbbTV', // experimental
540
- 'WebKit' => '(webkit)[ /]([\w.]+)',
541
- // @todo: Include JXD consoles.
542
- 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b',
543
- 'Watch' => 'SM-V700',
544
- );
545
-
546
- /**
547
- * All possible HTTP headers that represent the
548
- * User-Agent string.
549
- *
550
- * @var array
551
- */
552
- protected static $uaHttpHeaders = array(
553
- // The default User-Agent string.
554
- 'HTTP_USER_AGENT',
555
- // Header can occur on devices using Opera Mini.
556
- 'HTTP_X_OPERAMINI_PHONE_UA',
557
- // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/
558
- 'HTTP_X_DEVICE_USER_AGENT',
559
- 'HTTP_X_ORIGINAL_USER_AGENT',
560
- 'HTTP_X_SKYFIRE_PHONE',
561
- 'HTTP_X_BOLT_PHONE_UA',
562
- 'HTTP_DEVICE_STOCK_UA',
563
- 'HTTP_X_UCBROWSER_DEVICE_UA'
564
- );
565
-
566
- /**
567
- * The individual segments that could exist in a User-Agent string. VER refers to the regular
568
- * expression defined in the constant self::VER.
569
- *
570
- * @var array
571
- */
572
- protected static $properties = array(
573
-
574
- // Build
575
- 'Mobile' => 'Mobile/[VER]',
576
- 'Build' => 'Build/[VER]',
577
- 'Version' => 'Version/[VER]',
578
- 'VendorID' => 'VendorID/[VER]',
579
-
580
- // Devices
581
- 'iPad' => 'iPad.*CPU[a-z ]+[VER]',
582
- 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]',
583
- 'iPod' => 'iPod.*CPU[a-z ]+[VER]',
584
- //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'),
585
- 'Kindle' => 'Kindle/[VER]',
586
-
587
- // Browser
588
- 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'),
589
- 'Coast' => array('Coast/[VER]'),
590
- 'Dolfin' => 'Dolfin/[VER]',
591
- // @reference: https://developer.mozilla.org/en-US/docs/User_Agent_Strings_Reference
592
- 'Firefox' => 'Firefox/[VER]',
593
- 'Fennec' => 'Fennec/[VER]',
594
- // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx
595
- // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx
596
- 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'),
597
- // http://en.wikipedia.org/wiki/NetFront
598
- 'NetFront' => 'NetFront/[VER]',
599
- 'NokiaBrowser' => 'NokiaBrowser/[VER]',
600
- 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ),
601
- 'Opera Mini' => 'Opera Mini/[VER]',
602
- 'Opera Mobi' => 'Version/[VER]',
603
- 'UC Browser' => 'UC Browser[VER]',
604
- 'MQQBrowser' => 'MQQBrowser/[VER]',
605
- 'MicroMessenger' => 'MicroMessenger/[VER]',
606
- 'baiduboxapp' => 'baiduboxapp/[VER]',
607
- 'baidubrowser' => 'baidubrowser/[VER]',
608
- 'Iron' => 'Iron/[VER]',
609
- // @note: Safari 7534.48.3 is actually Version 5.1.
610
- // @note: On BlackBerry the Version is overwriten by the OS.
611
- 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ),
612
- 'Skyfire' => 'Skyfire/[VER]',
613
- 'Tizen' => 'Tizen/[VER]',
614
- 'Webkit' => 'webkit[ /][VER]',
615
-
616
- // Engine
617
- 'Gecko' => 'Gecko/[VER]',
618
- 'Trident' => 'Trident/[VER]',
619
- 'Presto' => 'Presto/[VER]',
620
-
621
- // OS
622
- 'iOS' => ' \bi?OS\b [VER][ ;]{1}',
623
- 'Android' => 'Android [VER]',
624
- 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'),
625
- 'BREW' => 'BREW [VER]',
626
- 'Java' => 'Java/[VER]',
627
- // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx
628
- // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases
629
- 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'),
630
- 'Windows Phone' => 'Windows Phone [VER]',
631
- 'Windows CE' => 'Windows CE/[VER]',
632
- // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd
633
- 'Windows NT' => 'Windows NT [VER]',
634
- 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'),
635
- 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'),
636
- );
637
-
638
- /**
639
- * Construct an instance of this class.
640
- *
641
- * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored.
642
- * If left empty, will use the global _SERVER['HTTP_*'] vars instead.
643
- * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT
644
- * from the $headers array instead.
645
- */
646
- public function __construct(
647
- array $headers = null,
648
- $userAgent = null
649
- ) {
650
- $this->setHttpHeaders($headers);
651
- $this->setUserAgent($userAgent);
652
- }
653
 
654
- /**
655
- * Get the current script version.
656
- * This is useful for the demo.php file,
657
- * so people can check on what version they are testing
658
- * for mobile devices.
659
- *
660
- * @return string The version number in semantic version format.
661
- */
662
- public static function getScriptVersion()
663
- {
664
- return self::VERSION;
665
  }
666
 
667
- /**
668
- * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers.
669
- *
670
- * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract
671
- * the headers. The default null is left for backwards compatibilty.
672
- */
673
- public function setHttpHeaders($httpHeaders = null)
674
- {
675
- // use global _SERVER if $httpHeaders aren't defined
676
- if (!is_array($httpHeaders) || !count($httpHeaders)) {
677
- $httpHeaders = $_SERVER;
678
  }
 
679
 
680
- // clear existing headers
681
- $this->httpHeaders = array();
 
682
 
683
- // Only save HTTP headers. In PHP land, that means only _SERVER vars that
684
- // start with HTTP_.
685
- foreach ($httpHeaders as $key => $value) {
686
- if (substr($key, 0, 5) === 'HTTP_') {
687
- $this->httpHeaders[$key] = $value;
688
- }
689
- }
 
 
690
 
691
- // In case we're dealing with CloudFront, we need to know.
692
- $this->setCfHeaders($httpHeaders);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
693
  }
694
 
695
- /**
696
- * Retrieves the HTTP headers.
697
- *
698
- * @return array
699
- */
700
- public function getHttpHeaders()
701
- {
702
- return $this->httpHeaders;
703
- }
704
 
705
- /**
706
- * Retrieves a particular header. If it doesn't exist, no exception/error is caused.
707
- * Simply null is returned.
708
- *
709
- * @param string $header The name of the header to retrieve. Can be HTTP compliant such as
710
- * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the
711
- * all-caps, HTTP_ prefixed, underscore seperated awesomeness.
712
- *
713
- * @return string|null The value of the header.
714
- */
715
- public function getHttpHeader($header)
716
- {
717
- // are we using PHP-flavored headers?
718
- if (strpos($header, '_') === false) {
719
- $header = str_replace('-', '_', $header);
720
- $header = strtoupper($header);
721
- }
722
 
723
- // test the alternate, too
724
- $altHeader = 'HTTP_' . $header;
725
 
726
- //Test both the regular and the HTTP_ prefix
727
- if (isset($this->httpHeaders[$header])) {
728
- return $this->httpHeaders[$header];
729
- } elseif (isset($this->httpHeaders[$altHeader])) {
730
- return $this->httpHeaders[$altHeader];
731
- }
732
 
733
- return null;
734
- }
 
 
 
 
 
 
 
 
735
 
736
- public function getMobileHeaders()
737
- {
738
- return self::$mobileHeaders;
739
- }
740
 
741
- /**
742
- * Get all possible HTTP headers that
743
- * can contain the User-Agent string.
744
- *
745
- * @return array List of HTTP headers.
746
- */
747
- public function getUaHttpHeaders()
748
- {
749
- return self::$uaHttpHeaders;
 
 
 
750
  }
751
 
752
-
753
- /**
754
- * Set CloudFront headers
755
- * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device
756
- *
757
- * @param array $cfHeaders List of HTTP headers
758
- *
759
- * @return boolean If there were CloudFront headers to be set
760
- */
761
- public function setCfHeaders($cfHeaders = null) {
762
- // use global _SERVER if $cfHeaders aren't defined
763
- if (!is_array($cfHeaders) || !count($cfHeaders)) {
764
- $cfHeaders = $_SERVER;
765
- }
766
-
767
- // clear existing headers
768
- $this->cloudfrontHeaders = array();
769
 
770
- // Only save CLOUDFRONT headers. In PHP land, that means only _SERVER vars that
771
- // start with cloudfront-.
772
- $response = false;
773
- foreach ($cfHeaders as $key => $value) {
774
- if (substr(strtolower($key), 0, 16) === 'http_cloudfront_') {
775
- $this->cloudfrontHeaders[strtoupper($key)] = $value;
776
- $response = true;
777
- }
778
  }
779
-
780
- return $response;
781
  }
782
 
783
- /**
784
- * Retrieves the cloudfront headers.
785
- *
786
- * @return array
787
- */
788
- public function getCfHeaders()
789
- {
790
- return $this->cloudfrontHeaders;
791
- }
792
 
793
- /**
794
- * Set the User-Agent to be used.
795
- *
796
- * @param string $userAgent The user agent string to set.
797
- *
798
- * @return string|null
799
- */
800
- public function setUserAgent($userAgent = null)
801
- {
802
- // Invalidate cache due to #375
803
- $this->cache = array();
804
-
805
- if (false === empty($userAgent)) {
806
- return $this->userAgent = $userAgent;
807
- } else {
808
- $this->userAgent = null;
809
- foreach ($this->getUaHttpHeaders() as $altHeader) {
810
- if (false === empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban)
811
- $this->userAgent .= $this->httpHeaders[$altHeader] . " ";
812
- }
813
- }
814
 
815
- if (!empty($this->userAgent)) {
816
- return $this->userAgent = trim($this->userAgent);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
817
  }
818
  }
819
 
820
- if (count($this->getCfHeaders()) > 0) {
821
- return $this->userAgent = 'Amazon CloudFront';
822
  }
823
- return $this->userAgent = null;
824
  }
825
 
826
- /**
827
- * Retrieve the User-Agent.
828
- *
829
- * @return string|null The user agent if it's set.
830
- */
831
- public function getUserAgent()
832
- {
833
- return $this->userAgent;
834
  }
 
 
835
 
836
- /**
837
- * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or
838
- * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set.
839
- *
840
- * @deprecated since version 2.6.9
841
- *
842
- * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default
843
- * parameter is null which will default to self::DETECTION_TYPE_MOBILE.
844
- */
845
- public function setDetectionType($type = null)
846
- {
847
- if ($type === null) {
848
- $type = self::DETECTION_TYPE_MOBILE;
849
- }
850
-
851
- if ($type !== self::DETECTION_TYPE_MOBILE && $type !== self::DETECTION_TYPE_EXTENDED) {
852
- return;
853
- }
854
 
855
- $this->detectionType = $type;
 
 
 
 
 
 
 
 
 
 
 
 
856
  }
857
 
858
- public function getMatchingRegex()
859
- {
860
- return $this->matchingRegex;
861
  }
862
 
863
- public function getMatchesArray()
864
- {
865
- return $this->matchesArray;
866
- }
867
 
868
- /**
869
- * Retrieve the list of known phone devices.
870
- *
871
- * @return array List of phone devices.
872
- */
873
- public static function getPhoneDevices()
874
- {
875
- return self::$phoneDevices;
876
- }
877
 
878
- /**
879
- * Retrieve the list of known tablet devices.
880
- *
881
- * @return array List of tablet devices.
882
- */
883
- public static function getTabletDevices()
884
- {
885
- return self::$tabletDevices;
886
- }
887
 
888
- /**
889
- * Alias for getBrowsers() method.
890
- *
891
- * @return array List of user agents.
892
- */
893
- public static function getUserAgents()
894
- {
895
- return self::getBrowsers();
896
- }
897
 
898
- /**
899
- * Retrieve the list of known browsers. Specifically, the user agents.
900
- *
901
- * @return array List of browsers / user agents.
902
- */
903
- public static function getBrowsers()
904
- {
905
- return self::$browsers;
906
- }
907
 
908
- /**
909
- * Retrieve the list of known utilities.
910
- *
911
- * @return array List of utilities.
912
- */
913
- public static function getUtilities()
914
- {
915
- return self::$utilities;
916
- }
917
 
918
- /**
919
- * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*().
920
- *
921
- * @deprecated since version 2.6.9
922
- *
923
- * @return array All the rules (but not extended).
924
- */
925
- public static function getMobileDetectionRules()
926
- {
927
- static $rules;
928
-
929
- if (!$rules) {
930
- $rules = array_merge(
931
- self::$phoneDevices,
932
- self::$tabletDevices,
933
- self::$operatingSystems,
934
- self::$browsers
935
- );
936
- }
937
 
938
- return $rules;
 
 
 
 
 
 
 
 
939
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
940
  }
941
 
942
- /**
943
- * Method gets the mobile detection rules + utilities.
944
- * The reason this is separate is because utilities rules
945
- * don't necessary imply mobile. This method is used inside
946
- * the new $detect->is('stuff') method.
947
- *
948
- * @deprecated since version 2.6.9
949
- *
950
- * @return array All the rules + extended.
951
- */
952
- public function getMobileDetectionRulesExtended()
953
- {
954
- static $rules;
955
-
956
- if (!$rules) {
957
- // Merge all rules together.
958
- $rules = array_merge(
959
- self::$phoneDevices,
960
- self::$tabletDevices,
961
- self::$operatingSystems,
962
- self::$browsers,
963
- self::$utilities
964
- );
965
- }
966
 
967
- return $rules;
968
- }
969
 
970
- /**
971
- * Retrieve the current set of rules.
972
- *
973
- * @deprecated since version 2.6.9
974
- *
975
- * @return array
976
- */
977
- public function getRules()
978
- {
979
- if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) {
980
- return self::getMobileDetectionRulesExtended();
981
- } else {
982
- return self::getMobileDetectionRules();
983
- }
 
 
 
 
 
 
 
 
 
984
  }
985
 
986
- /**
987
- * Retrieve the list of mobile operating systems.
988
- *
989
- * @return array The list of mobile operating systems.
990
- */
991
- public static function getOperatingSystems()
992
- {
993
- return self::$operatingSystems;
 
 
 
 
 
 
 
 
994
  }
 
995
 
996
- /**
997
- * Check the HTTP headers for signs of mobile.
998
- * This is the fastest mobile check possible; it's used
999
- * inside isMobile() method.
1000
- *
1001
- * @return bool
1002
- */
1003
- public function checkHttpHeadersForMobile()
1004
- {
1005
-
1006
- foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) {
1007
- if (isset($this->httpHeaders[$mobileHeader])) {
1008
- if (is_array($matchType['matches'])) {
1009
- foreach ($matchType['matches'] as $_match) {
1010
- if (strpos($this->httpHeaders[$mobileHeader], $_match) !== false) {
1011
- return true;
1012
- }
1013
- }
 
1014
 
1015
- return false;
1016
- } else {
1017
- return true;
 
 
 
 
1018
  }
 
 
 
 
1019
  }
1020
  }
1021
-
1022
- return false;
1023
-
1024
  }
1025
 
1026
- /**
1027
- * Magic overloading method.
1028
- *
1029
- * @method boolean is[...]()
1030
- * @param string $name
1031
- * @param array $arguments
1032
- * @return mixed
1033
- * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is'
1034
- */
1035
- public function __call($name, $arguments)
1036
- {
1037
- // make sure the name starts with 'is', otherwise
1038
- if (substr($name, 0, 2) !== 'is') {
1039
- throw new BadMethodCallException("No such method exists: $name");
1040
- }
1041
-
1042
- $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
1043
 
1044
- $key = substr($name, 2);
1045
 
1046
- return $this->matchUAAgainstKey($key);
 
 
 
 
 
 
 
 
 
 
 
 
 
1047
  }
1048
 
1049
- /**
1050
- * Find a detection rule that matches the current User-agent.
1051
- *
1052
- * @param null $userAgent deprecated
1053
- * @return boolean
1054
- */
1055
- protected function matchDetectionRulesAgainstUA($userAgent = null)
1056
- {
1057
- // Begin general search.
1058
- foreach ($this->getRules() as $_regex) {
1059
- if (empty($_regex)) {
1060
- continue;
1061
- }
1062
 
1063
- if ($this->match($_regex, $userAgent)) {
1064
- return true;
1065
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1066
  }
1067
 
1068
- return false;
 
 
1069
  }
1070
 
1071
- /**
1072
- * Search for a certain key in the rules array.
1073
- * If the key is found the try to match the corresponding
1074
- * regex against the User-Agent.
1075
- *
1076
- * @param string $key
1077
- *
1078
- * @return boolean
1079
- */
1080
- protected function matchUAAgainstKey($key)
1081
- {
1082
- // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc.
1083
- $key = strtolower($key);
1084
- if (false === isset($this->cache[$key])) {
1085
 
1086
- // change the keys to lower case
1087
- $_rules = array_change_key_case($this->getRules());
 
 
 
 
 
 
 
 
 
 
 
 
1088
 
1089
- if (false === empty($_rules[$key])) {
1090
- $this->cache[$key] = $this->match($_rules[$key]);
1091
- }
1092
 
1093
- if (false === isset($this->cache[$key])) {
1094
- $this->cache[$key] = false;
1095
- }
1096
  }
1097
 
1098
- return $this->cache[$key];
 
 
1099
  }
1100
 
1101
- /**
1102
- * Check if the device is mobile.
1103
- * Returns true if any type of mobile device detected, including special ones
1104
- * @param null $userAgent deprecated
1105
- * @param null $httpHeaders deprecated
1106
- * @return bool
1107
- */
1108
- public function isMobile($userAgent = null, $httpHeaders = null)
1109
- {
1110
-
1111
- if ($httpHeaders) {
1112
- $this->setHttpHeaders($httpHeaders);
1113
- }
1114
 
1115
- if ($userAgent) {
1116
- $this->setUserAgent($userAgent);
1117
- }
 
 
 
 
 
 
1118
 
1119
- // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront'
1120
- if ($this->getUserAgent() === 'Amazon CloudFront') {
1121
- $cfHeaders = $this->getCfHeaders();
1122
- if(array_key_exists('HTTP_CLOUDFRONT_IS_MOBILE_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER'] === 'true') {
1123
- return true;
1124
- }
1125
- }
1126
 
1127
- $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
 
 
1128
 
1129
- if ($this->checkHttpHeadersForMobile()) {
 
 
 
1130
  return true;
1131
- } else {
1132
- return $this->matchDetectionRulesAgainstUA();
1133
  }
1134
-
1135
  }
1136
 
1137
- /**
1138
- * Check if the device is a tablet.
1139
- * Return true if any type of tablet device is detected.
1140
- *
1141
- * @param string $userAgent deprecated
1142
- * @param array $httpHeaders deprecated
1143
- * @return bool
1144
- */
1145
- public function isTablet($userAgent = null, $httpHeaders = null)
1146
- {
1147
- // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront'
1148
- if ($this->getUserAgent() === 'Amazon CloudFront') {
1149
- $cfHeaders = $this->getCfHeaders();
1150
- if(array_key_exists('HTTP_CLOUDFRONT_IS_TABLET_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_TABLET_VIEWER'] === 'true') {
1151
- return true;
1152
- }
1153
- }
1154
 
1155
- $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
 
 
 
 
1156
 
1157
- foreach (self::$tabletDevices as $_regex) {
1158
- if ($this->match($_regex, $userAgent)) {
1159
- return true;
1160
- }
1161
- }
1162
 
1163
- return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1164
  }
1165
 
1166
- /**
1167
- * This method checks for a certain property in the
1168
- * userAgent.
1169
- * @todo: The httpHeaders part is not yet used.
1170
- *
1171
- * @param string $key
1172
- * @param string $userAgent deprecated
1173
- * @param string $httpHeaders deprecated
1174
- * @return bool|int|null
1175
- */
1176
- public function is($key, $userAgent = null, $httpHeaders = null)
1177
- {
1178
- // Set the UA and HTTP headers only if needed (eg. batch mode).
1179
- if ($httpHeaders) {
1180
- $this->setHttpHeaders($httpHeaders);
1181
- }
1182
 
1183
- if ($userAgent) {
1184
- $this->setUserAgent($userAgent);
 
1185
  }
 
1186
 
1187
- $this->setDetectionType(self::DETECTION_TYPE_EXTENDED);
 
1188
 
1189
- return $this->matchUAAgainstKey($key);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1190
  }
1191
 
1192
- /**
1193
- * Some detection rules are relative (not standard),
1194
- * because of the diversity of devices, vendors and
1195
- * their conventions in representing the User-Agent or
1196
- * the HTTP headers.
1197
- *
1198
- * This method will be used to check custom regexes against
1199
- * the User-Agent string.
1200
- *
1201
- * @param $regex
1202
- * @param string $userAgent
1203
- * @return bool
1204
- *
1205
- * @todo: search in the HTTP headers too.
1206
- */
1207
- public function match($regex, $userAgent = null)
1208
- {
1209
- $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches);
1210
- // If positive match is found, store the results for debug.
1211
- if ($match) {
1212
- $this->matchingRegex = $regex;
1213
- $this->matchesArray = $matches;
1214
- }
1215
-
1216
- return $match;
1217
  }
1218
 
1219
- /**
1220
- * Get the properties array.
1221
- *
1222
- * @return array
1223
- */
1224
- public static function getProperties()
1225
- {
1226
- return self::$properties;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1227
  }
1228
 
1229
- /**
1230
- * Prepare the version number.
1231
- *
1232
- * @todo Remove the error supression from str_replace() call.
1233
- *
1234
- * @param string $ver The string version, like "2.6.21.2152";
1235
- *
1236
- * @return float
1237
- */
1238
- public function prepareVersionNo($ver)
1239
- {
1240
- $ver = str_replace(array('_', ' ', '/'), '.', $ver);
1241
- $arrVer = explode('.', $ver, 2);
1242
-
1243
- if (isset($arrVer[1])) {
1244
- $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions.
1245
- }
1246
 
1247
- return (float) implode('.', $arrVer);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1248
  }
1249
 
1250
- /**
1251
- * Check the version of the given property in the User-Agent.
1252
- * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31)
1253
- *
1254
- * @param string $propertyName The name of the property. See self::getProperties() array
1255
- * keys for all possible properties.
1256
- * @param string $type Either self::VERSION_TYPE_STRING to get a string value or
1257
- * self::VERSION_TYPE_FLOAT indicating a float value. This parameter
1258
- * is optional and defaults to self::VERSION_TYPE_STRING. Passing an
1259
- * invalid parameter will default to the this type as well.
1260
- *
1261
- * @return string|float The version of the property we are trying to extract.
1262
- */
1263
- public function version($propertyName, $type = self::VERSION_TYPE_STRING)
1264
- {
1265
- if (empty($propertyName)) {
1266
- return false;
1267
- }
1268
 
1269
- // set the $type to the default if we don't recognize the type
1270
- if ($type !== self::VERSION_TYPE_STRING && $type !== self::VERSION_TYPE_FLOAT) {
1271
- $type = self::VERSION_TYPE_STRING;
1272
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1273
 
1274
- $properties = self::getProperties();
 
 
 
1275
 
1276
- // Check if the property exists in the properties array.
1277
- if (true === isset($properties[$propertyName])) {
1278
 
1279
- // Prepare the pattern to be matched.
1280
- // Make sure we always deal with an array (string is converted).
1281
- $properties[$propertyName] = (array) $properties[$propertyName];
1282
 
1283
- foreach ($properties[$propertyName] as $propertyMatchString) {
 
 
1284
 
1285
- $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString);
1286
 
1287
- // Identify and extract the version.
1288
- preg_match(sprintf('#%s#is', $propertyPattern), $this->userAgent, $match);
1289
 
1290
- if (false === empty($match[1])) {
1291
- $version = ($type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1]);
1292
 
1293
- return $version;
1294
- }
1295
 
 
1296
  }
1297
 
1298
  }
1299
 
1300
- return false;
1301
  }
1302
 
1303
- /**
1304
- * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants.
1305
- *
1306
- * @return string One of the self::MOBILE_GRADE_* constants.
1307
- */
1308
- public function mobileGrade()
1309
- {
1310
- $isMobile = $this->isMobile();
1311
 
1312
- if (
1313
- // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0)
1314
- $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) >= 4.3 ||
1315
- $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) >= 4.3 ||
1316
- $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) >= 4.3 ||
 
 
 
1317
 
1318
- // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5)
1319
- // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM
1320
- // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices
1321
- // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7
1322
- ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) ||
1323
 
1324
- // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8)
1325
- $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT) >= 7.5 ||
 
 
 
1326
 
1327
- // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10)
1328
- $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 6.0 ||
1329
- // Blackberry Playbook (1.0-2.0) - Tested on PlayBook
1330
- $this->match('Playbook.*Tablet') ||
1331
 
1332
- // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0)
1333
- ( $this->version('webOS', self::VERSION_TYPE_FLOAT) >= 1.4 && $this->match('Palm|Pre|Pixi') ) ||
1334
- // Palm WebOS 3.0 - Tested on HP TouchPad
1335
- $this->match('hp.*TouchPad') ||
1336
 
1337
- // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices
1338
- ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 18 ) ||
 
 
1339
 
1340
- // Chrome for Android - Tested on Android 4.0, 4.1 device
1341
- ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 4.0 ) ||
1342
 
1343
- // Skyfire 4.1 - Tested on Android 2.3 device
1344
- ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT) >= 4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) ||
1345
 
1346
- // Opera Mobile 11.5-12: Tested on Android 2.3
1347
- ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11.5 && $this->is('AndroidOS') ) ||
1348
 
1349
- // Meego 1.2 - Tested on Nokia 950 and N9
1350
- $this->is('MeeGoOS') ||
1351
 
1352
- // Tizen (pre-release) - Tested on early hardware
1353
- $this->is('Tizen') ||
1354
 
1355
- // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser
1356
- // @todo: more tests here!
1357
- $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT) >= 2.0 ||
1358
 
1359
- // UC Browser - Tested on Android 2.3 device
1360
- ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) ||
 
1361
 
1362
- // Kindle 3 and Fire - Tested on the built-in WebKit browser for each
1363
- ( $this->match('Kindle Fire') ||
1364
- $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT) >= 3.0 ) ||
1365
 
1366
- // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet
1367
- $this->is('AndroidOS') && $this->is('NookTablet') ||
 
1368
 
1369
- // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7
1370
- $this->version('Chrome', self::VERSION_TYPE_FLOAT) >= 16 && !$isMobile ||
1371
 
1372
- // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7
1373
- $this->version('Safari', self::VERSION_TYPE_FLOAT) >= 5.0 && !$isMobile ||
1374
 
1375
- // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7
1376
- $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 10.0 && !$isMobile ||
1377
 
1378
- // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7
1379
- $this->version('IE', self::VERSION_TYPE_FLOAT) >= 7.0 && !$isMobile ||
1380
 
1381
- // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7
1382
- $this->version('Opera', self::VERSION_TYPE_FLOAT) >= 10 && !$isMobile
1383
- ){
1384
- return self::MOBILE_GRADE_A;
1385
- }
1386
 
1387
- if (
1388
- $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 ||
1389
- $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 ||
1390
- $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 ||
 
1391
 
1392
- // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770
1393
- $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 ||
 
 
1394
 
1395
- //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3
1396
- ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT) >= 5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT) <= 7.0 &&
1397
- ($this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 || $this->is('iOS')) ) ||
1398
 
1399
- // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1)
1400
- $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') ||
 
1401
 
1402
- // @todo: report this (tested on Nokia N71)
1403
- $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11 && $this->is('SymbianOS')
1404
- ){
1405
- return self::MOBILE_GRADE_B;
1406
- }
1407
 
1408
- if (
1409
- // Blackberry 4.x - Tested on the Curve 8330
1410
- $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) <= 5.0 ||
1411
- // Windows Mobile - Tested on the HTC Leo (WinMo 5.2)
1412
- $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT) <= 5.2 ||
1413
-
1414
- // Tested on original iPhone (3.1), iPhone 3 (3.2)
1415
- $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) <= 3.2 ||
1416
- $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) <= 3.2 ||
1417
- $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) <= 3.2 ||
1418
-
1419
- // Internet Explorer 7 and older - Tested on Windows XP
1420
- $this->version('IE', self::VERSION_TYPE_FLOAT) <= 7.0 && !$isMobile
1421
- ){
1422
- return self::MOBILE_GRADE_C;
1423
- }
1424
 
1425
- // All older smartphone platforms and featurephones - Any device that doesn't support media queries
1426
- // will receive the basic, C grade experience.
 
 
 
 
 
 
1427
  return self::MOBILE_GRADE_C;
1428
  }
 
 
 
 
1429
  }
1430
  }
22
  * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md
23
  * HOWTO: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples
24
  *
25
+ * @version 2.8.24
26
  */
27
+
28
+ class Ig_Mobile_Detect
29
  {
30
+ /**
31
+ * Mobile detection type.
32
+ *
33
+ * @deprecated since version 2.6.9
34
+ */
35
+ const DETECTION_TYPE_MOBILE = 'mobile';
36
+
37
+ /**
38
+ * Extended detection type.
39
+ *
40
+ * @deprecated since version 2.6.9
41
+ */
42
+ const DETECTION_TYPE_EXTENDED = 'extended';
43
+
44
+ /**
45
+ * A frequently used regular expression to extract version #s.
46
+ *
47
+ * @deprecated since version 2.6.9
48
+ */
49
+ const VER = '([\w._\+]+)';
50
+
51
+ /**
52
+ * Top-level device.
53
+ */
54
+ const MOBILE_GRADE_A = 'A';
55
+
56
+ /**
57
+ * Mid-level device.
58
+ */
59
+ const MOBILE_GRADE_B = 'B';
60
+
61
+ /**
62
+ * Low-level device.
63
+ */
64
+ const MOBILE_GRADE_C = 'C';
65
+
66
+ /**
67
+ * Stores the version number of the current release.
68
+ */
69
+ const VERSION = '2.8.24';
70
+
71
+ /**
72
+ * A type for the version() method indicating a string return value.
73
+ */
74
+ const VERSION_TYPE_STRING = 'text';
75
+
76
+ /**
77
+ * A type for the version() method indicating a float return value.
78
+ */
79
+ const VERSION_TYPE_FLOAT = 'float';
80
+
81
+ /**
82
+ * A cache for resolved matches
83
+ * @var array
84
+ */
85
+ protected $cache = array();
86
+
87
+ /**
88
+ * The User-Agent HTTP header is stored in here.
89
+ * @var string
90
+ */
91
+ protected $userAgent = null;
92
+
93
+ /**
94
+ * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE.
95
+ * @var array
96
+ */
97
+ protected $httpHeaders = array();
98
+
99
+ /**
100
+ * CloudFront headers. E.g. CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer & CloudFront-Is-Tablet-Viewer.
101
+ * @var array
102
+ */
103
+ protected $cloudfrontHeaders = array();
104
+
105
+ /**
106
+ * The matching Regex.
107
+ * This is good for debug.
108
+ * @var string
109
+ */
110
+ protected $matchingRegex = null;
111
+
112
+ /**
113
+ * The matches extracted from the regex expression.
114
+ * This is good for debug.
115
+ * @var string
116
+ */
117
+ protected $matchesArray = null;
118
+
119
+ /**
120
+ * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED.
121
+ *
122
+ * @deprecated since version 2.6.9
123
+ *
124
+ * @var string
125
+ */
126
+ protected $detectionType = self::DETECTION_TYPE_MOBILE;
127
+
128
+ /**
129
+ * HTTP headers that trigger the 'isMobile' detection
130
+ * to be true.
131
+ *
132
+ * @var array
133
+ */
134
+ protected static $mobileHeaders = array(
135
+
136
+ 'HTTP_ACCEPT' => array('matches' => array(
137
+ // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/
138
+ 'application/x-obml2d',
139
+ // BlackBerry devices.
140
+ 'application/vnd.rim.html',
141
+ 'text/vnd.wap.wml',
142
+ 'application/vnd.wap.xhtml+xml'
143
+ )),
144
+ 'HTTP_X_WAP_PROFILE' => null,
145
+ 'HTTP_X_WAP_CLIENTID' => null,
146
+ 'HTTP_WAP_CONNECTION' => null,
147
+ 'HTTP_PROFILE' => null,
148
+ // Reported by Opera on Nokia devices (eg. C3).
149
+ 'HTTP_X_OPERAMINI_PHONE_UA' => null,
150
+ 'HTTP_X_NOKIA_GATEWAY_ID' => null,
151
+ 'HTTP_X_ORANGE_ID' => null,
152
+ 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null,
153
+ 'HTTP_X_HUAWEI_USERID' => null,
154
+ // Reported by Windows Smartphones.
155
+ 'HTTP_UA_OS' => null,
156
+ // Reported by Verizon, Vodafone proxy system.
157
+ 'HTTP_X_MOBILE_GATEWAY' => null,
158
+ // Seen this on HTC Sensation. SensationXE_Beats_Z715e.
159
+ 'HTTP_X_ATT_DEVICEID' => null,
160
+ // Seen this on a HTC.
161
+ 'HTTP_UA_CPU' => array('matches' => array('ARM')),
162
+ );
163
+
164
+ /**
165
+ * List of mobile devices (phones).
166
+ *
167
+ * @var array
168
+ */
169
+ protected static $phoneDevices = array(
170
+ 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes
171
+ 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+',
172
+ 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m',
173
+ 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6',
174
+ // @todo: Is 'Dell Streak' a tablet or a phone? ;)
175
+ 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b',
176
+ 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b',
177
+ 'Samsung' => '\bSamsung\b|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F',
178
+ 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)',
179
+ 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533',
180
+ 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile',
181
+ 'NokiaLumia' => 'Lumia [0-9]{3,4}',
182
+ // http://www.micromaxinfo.com/mobiles/smartphones
183
+ // Added because the codes might conflict with Acer Tablets.
184
+ 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b',
185
+ // @todo Complete the regex.
186
+ 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ;
187
+ 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;)
188
+ // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH)
189
+ // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android.
190
+ 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790',
191
+ // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones.
192
+ 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250',
193
+ // http://fr.wikomobile.com
194
+ 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM',
195
+ 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)',
196
+ // Added simvalley mobile just for fun. They have some interesting devices.
197
+ // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html
198
+ 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b',
199
+ // Wolfgang - a brand that is sold by Aldi supermarkets.
200
+ // http://www.wolfgangmobile.com/
201
+ 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q',
202
+ 'Alcatel' => 'Alcatel',
203
+ 'Nintendo' => 'Nintendo 3DS',
204
+ // http://en.wikipedia.org/wiki/Amoi
205
+ 'Amoi' => 'Amoi',
206
+ // http://en.wikipedia.org/wiki/INQ
207
+ 'INQ' => 'INQ',
208
+ // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039
209
+ 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser',
210
+ );
211
+
212
+ /**
213
+ * List of tablet devices.
214
+ *
215
+ * @var array
216
+ */
217
+ protected static $tabletDevices = array(
218
+ // @todo: check for mobile friendly emails topic.
219
+ 'iPad' => 'iPad|iPad.*Mobile',
220
+ // Removed |^.*Android.*Nexus(?!(?:Mobile).)*$
221
+ // @see #442
222
+ 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)',
223
+ 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y|SM-T280', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone.
224
+ // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html
225
+ 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI)\b',
226
+ // Only the Surface tablets with Windows RT are considered mobile.
227
+ // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx
228
+ 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)',
229
+ // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT
230
+ 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10',
231
+ // Watch out for PadFone, see #132.
232
+ // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/
233
+ 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z',
234
+ 'BlackBerryTablet' => 'PlayBook|RIM Tablet',
235
+ 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410',
236
+ 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617',
237
+ 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2',
238
+ // http://www.acer.ro/ac/ro/RO/content/drivers
239
+ // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer)
240
+ // http://us.acer.com/ac/en/US/content/group/tablets
241
+ // http://www.acer.de/ac/de/DE/content/models/tablets/
242
+ // Can conflict with Micromax and Motorola phones codes.
243
+ 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b|\bA3-A20\b|\bA3-A30',
244
+ // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/
245
+ // http://us.toshiba.com/tablets/tablet-finder
246
+ // http://www.toshiba.co.jp/regza/tablet/
247
+ 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO',
248
+ // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html
249
+ // http://www.lg.com/us/tablets
250
+ 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b',
251
+ 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b',
252
+ // Prestigio Tablets http://www.prestigio.com/support
253
+ 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002',
254
+ // http://support.lenovo.com/en_GB/downloads/default.page?#
255
+ 'LenovoTablet' => 'Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)',
256
+ // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets
257
+ 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7',
258
+ // http://www.yarvik.com/en/matrix/tablets/
259
+ 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b',
260
+ 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB',
261
+ 'ArnovaTablet' => '97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2',
262
+ // http://www.intenso.de/kategorie_en.php?kategorie=33
263
+ // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate
264
+ 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004',
265
+ // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/
266
+ 'IRUTablet' => 'M702pro',
267
+ 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b',
268
+ // http://www.e-boda.ro/tablete-pc.html
269
+ 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)',
270
+ // http://www.allview.ro/produse/droseries/lista-tablete-pc/
271
+ 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)',
272
+ // http://wiki.archosfans.com/index.php?title=Main_Page
273
+ 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b',
274
+ // http://www.ainol.com/plugin.php?identifier=ainol&module=product
275
+ 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark',
276
+ 'NokiaLumiaTablet' => 'Lumia 2520',
277
+ // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER
278
+ // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser
279
+ // http://www.sony.jp/support/tablet/
280
+ 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31',
281
+ // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8
282
+ 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b',
283
+ // db + http://www.cube-tablet.com/buy-products.html
284
+ 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT',
285
+ // http://www.cobyusa.com/?p=pcat&pcat_id=3001
286
+ 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010',
287
+ // http://www.match.net.cn/products.asp
288
+ 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10',
289
+ // http://www.msi.com/support
290
+ // @todo Research the Windows Tablets.
291
+ 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b',
292
+ // @todo http://www.kyoceramobile.com/support/drivers/
293
+ // 'KyoceraTablet' => null,
294
+ // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/
295
+ // 'IntextTablet' => null,
296
+ // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets)
297
+ // http://www.imp3.net/14/show.php?itemid=20454
298
+ 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)',
299
+ // http://www.rock-chips.com/index.php?do=prod&pid=2
300
+ 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A',
301
+ // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/
302
+ 'FlyTablet' => 'IQ310|Fly Vision',
303
+ // http://www.bqreaders.com/gb/tablets-prices-sale.html
304
+ 'bqTablet' => 'Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris [E|M]10)|Maxwell.*Lite|Maxwell.*Plus',
305
+ // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290
306
+ // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets)
307
+ 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim',
308
+ // Nec or Medias Tab
309
+ 'NecTablet' => '\bN-06D|\bN-08D',
310
+ // Pantech Tablets: http://www.pantechusa.com/phones/
311
+ 'PantechTablet' => 'Pantech.*P4100',
312
+ // Broncho Tablets: http://www.broncho.cn/ (hard to find)
313
+ 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)',
314
+ // http://versusuk.com/support.html
315
+ 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b',
316
+ // http://www.zync.in/index.php/our-products/tablet-phablets
317
+ 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900',
318
+ // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
319
+ 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA',
320
+ // https://www.nabitablet.com/
321
+ 'NabiTablet' => 'Android.*\bNabi',
322
+ 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build',
323
+ // French Danew Tablets http://www.danew.com/produits-tablette.php
324
+ 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b',
325
+ // Texet Tablets and Readers http://www.texet.ru/tablet/
326
+ 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE',
327
+ // Avoid detecting 'PLAYSTATION 3' as mobile.
328
+ 'PlaystationTablet' => 'Playstation.*(Portable|Vita)',
329
+ // http://www.trekstor.de/surftabs.html
330
+ 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab',
331
+ // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets
332
+ 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b',
333
+ // http://www.advandigital.com/index.php?link=content-product&jns=JP001
334
+ // because of the short codenames we have to include whitespaces to reduce the possible conflicts.
335
+ 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ',
336
+ // http://www.danytech.com/category/tablet-pc
337
+ 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1',
338
+ // http://www.galapad.net/product.html
339
+ 'GalapadTablet' => 'Android.*\bG1\b',
340
+ // http://www.micromaxinfo.com/tablet/funbook
341
+ 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b',
342
+ // http://www.karbonnmobiles.com/products_tablet.php
343
+ 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b',
344
+ // http://www.myallfine.com/Products.asp
345
+ 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide',
346
+ // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
347
+ 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b',
348
+ // http://www.yonesnav.com/products/products.php
349
+ 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026',
350
+ // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001
351
+ // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html)
352
+ 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503',
353
+ // http://www.gloryunion.cn/products.asp
354
+ // http://www.allwinnertech.com/en/apply/mobile.html
355
+ // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB)
356
+ // @todo: Softwiner tablets?
357
+ // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions.
358
+ 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G
359
+ // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118
360
+ 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10',
361
+ // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/
362
+ // @todo: add more tests.
363
+ 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)',
364
+ // http://hclmetablet.com/India/index.php
365
+ 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync',
366
+ // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html
367
+ 'DPSTablet' => 'DPS Dream 9|DPS Dual 7',
368
+ // http://www.visture.com/index.asp
369
+ 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10',
370
+ // http://www.mijncresta.nl/tablet
371
+ 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989',
372
+ // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309
373
+ 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b',
374
+ // Concorde tab
375
+ 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan',
376
+ // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/
377
+ 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042',
378
+ // Modecom Tablets - http://www.modecom.eu/tablets/portal/
379
+ 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003',
380
+ // Vonino Tablets - http://www.vonino.eu/tablets
381
+ 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b',
382
+ // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0
383
+ 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1',
384
+ // Storex Tablets - http://storex.fr/espace_client/support.html
385
+ // @note: no need to add all the tablet codes since they are guided by the first regex.
386
+ 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab',
387
+ // Generic Vodafone tablets.
388
+ 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497',
389
+ // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb
390
+ // Aka: http://www.essentielb.fr/
391
+ 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2',
392
+ // Ross & Moor - http://ross-moor.ru/
393
+ 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711',
394
+ // i-mobile http://product.i-mobilephone.com/Mobile_Device
395
+ 'iMobileTablet' => 'i-mobile i-note',
396
+ // http://www.tolino.de/de/vergleichen/
397
+ 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine',
398
+ // AudioSonic - a Kmart brand
399
+ // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72&currentPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1
400
+ 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b',
401
+ // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/
402
+ // @todo: add them gradually to avoid conflicts.
403
+ 'AMPETablet' => 'Android.* A78 ',
404
+ // Skk Mobile - http://skkmobile.com.ph/product_tablets.php
405
+ 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)',
406
+ // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1
407
+ 'TecnoTablet' => 'TECNO P9',
408
+ // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3
409
+ 'JXDTablet' => 'Android.* \b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b',
410
+ // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/
411
+ 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)',
412
+ // http://www.intracon.eu/tablet
413
+ 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10',
414
+ // http://www.xoro.de/produkte/
415
+ // @note: Might be the same brand with 'Simply tablets'
416
+ 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151',
417
+ // http://www1.viewsonic.com/products/computing/tablets/
418
+ 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a',
419
+ // http://www.odys.de/web/internet-tablet_en.html
420
+ 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10',
421
+ // http://www.captiva-power.de/products.html#tablets-en
422
+ 'CaptivaTablet' => 'CAPTIVA PAD',
423
+ // IconBIT - http://www.iconbit.com/products/tablets/
424
+ 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S',
425
+ // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63
426
+ 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi',
427
+ // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price
428
+ 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+',
429
+ 'JaytechTablet' => 'TPC-PA762',
430
+ 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010',
431
+ // http://www.digma.ru/support/download/
432
+ // @todo: Ebooks also (if requested)
433
+ 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b',
434
+ // http://www.evolioshop.com/ro/tablete-pc.html
435
+ // http://www.evolio.ro/support/downloads_static.html?cat=2
436
+ // @todo: Research some more
437
+ 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b',
438
+ // @todo http://www.lavamobiles.com/tablets-data-cards
439
+ 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b',
440
+ // http://www.breezetablet.com/
441
+ 'AocTablet' => 'MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712',
442
+ // http://www.mpmaneurope.com/en/products/internet-tablets-14/android-tablets-14/
443
+ 'MpmanTablet' => 'MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\bMPG7\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010',
444
+ // https://www.celkonmobiles.com/?_a=categoryphones&sid=2
445
+ 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b',
446
+ // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab
447
+ 'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b',
448
+ // http://www.mi.com/en
449
+ 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b',
450
+ // http://www.nbru.cn/index.html
451
+ 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One',
452
+ // http://navroad.com/products/produkty/tablety/
453
+ 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI',
454
+ // http://leader-online.com/new_site/product-category/tablets/
455
+ // http://www.leader-online.net.au/List/Tablet
456
+ 'LeaderTablet' => 'TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100',
457
+ // http://www.datawind.com/ubislate/
458
+ 'UbislateTablet' => 'UbiSlate[\s]?7C',
459
+ // http://www.pocketbook-int.com/ru/support
460
+ 'PocketBookTablet' => 'Pocketbook',
461
+ // http://www.kocaso.com/product_tablet.html
462
+ 'KocasoTablet' => '\b(TB-1207)\b',
463
+ // http://global.hisense.com/product/asia/tablet/Sero7/201412/t20141215_91832.htm
464
+ 'HisenseTablet' => '\b(F5281|E2371)\b',
465
+ // http://www.tesco.com/direct/hudl/
466
+ 'Hudl' => 'Hudl HT7S3|Hudl 2',
467
+ // http://www.telstra.com.au/home-phone/thub-2/
468
+ 'TelstraTablet' => 'T-Hub2',
469
+ 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bTP750\b'
470
+ );
471
+
472
+ /**
473
+ * List of mobile Operating Systems.
474
+ *
475
+ * @var array
476
+ */
477
+ protected static $operatingSystems = array(
478
+ 'AndroidOS' => 'Android',
479
+ 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os',
480
+ 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino',
481
+ 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b',
482
+ // @reference: http://en.wikipedia.org/wiki/Windows_Mobile
483
+ 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;',
484
+ // @reference: http://en.wikipedia.org/wiki/Windows_Phone
485
+ // http://wifeng.cn/?r=blog&a=view&id=106
486
+ // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx
487
+ // http://msdn.microsoft.com/library/ms537503.aspx
488
+ // https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx
489
+ 'WindowsPhoneOS' => 'Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;',
490
+ 'iOS' => '\biPhone.*Mobile|\biPod|\biPad',
491
+ // http://en.wikipedia.org/wiki/MeeGo
492
+ // @todo: research MeeGo in UAs
493
+ 'MeeGoOS' => 'MeeGo',
494
+ // http://en.wikipedia.org/wiki/Maemo
495
+ // @todo: research Maemo in UAs
496
+ 'MaemoOS' => 'Maemo',
497
+ 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135
498
+ 'webOS' => 'webOS|hpwOS',
499
+ 'badaOS' => '\bBada\b',
500
+ 'BREWOS' => 'BREW',
501
+ );
502
+
503
+ /**
504
+ * List of mobile User Agents.
505
+ *
506
+ * IMPORTANT: This is a list of only mobile browsers.
507
+ * Mobile Detect 2.x supports only mobile browsers,
508
+ * it was never designed to detect all browsers.
509
+ * The change will come in 2017 in the 3.x release for PHP7.
510
+ *
511
+ * @var array
512
+ */
513
+ protected static $browsers = array(
514
+ //'Vivaldi' => 'Vivaldi',
515
+ // @reference: https://developers.google.com/chrome/mobile/docs/user-agent
516
+ 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?',
517
+ 'Dolfin' => '\bDolfin\b',
518
+ 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+',
519
+ 'Skyfire' => 'Skyfire',
520
+ 'Edge' => 'Mobile Safari/[.0-9]* Edge',
521
+ 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+
522
+ 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS',
523
+ 'Bolt' => 'bolt',
524
+ 'TeaShark' => 'teashark',
525
+ 'Blazer' => 'Blazer',
526
+ // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3
527
+ 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari',
528
+ // http://en.wikipedia.org/wiki/Midori_(web_browser)
529
+ //'Midori' => 'midori',
530
+ //'Tizen' => 'Tizen',
531
+ 'UCBrowser' => 'UC.*Browser|UCWEB',
532
+ 'baiduboxapp' => 'baiduboxapp',
533
+ 'baidubrowser' => 'baidubrowser',
534
+ // https://github.com/serbanghita/Mobile-Detect/issues/7
535
+ 'DiigoBrowser' => 'DiigoBrowser',
536
+ // http://www.puffinbrowser.com/index.php
537
+ 'Puffin' => 'Puffin',
538
+ // http://mercury-browser.com/index.html
539
+ 'Mercury' => '\bMercury\b',
540
+ // http://en.wikipedia.org/wiki/Obigo_Browser
541
+ 'ObigoBrowser' => 'Obigo',
542
+ // http://en.wikipedia.org/wiki/NetFront
543
+ 'NetFront' => 'NF-Browser',
544
+ // @reference: http://en.wikipedia.org/wiki/Minimo
545
+ // http://en.wikipedia.org/wiki/Vision_Mobile_Browser
546
+ 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger',
547
+ // @reference: https://en.wikipedia.org/wiki/Pale_Moon_(web_browser)
548
+ 'PaleMoon' => 'Android.*PaleMoon|Mobile.*PaleMoon',
549
+ );
550
+
551
+ /**
552
+ * Utilities.
553
+ *
554
+ * @var array
555
+ */
556
+ protected static $utilities = array(
557
+ // Experimental. When a mobile device wants to switch to 'Desktop Mode'.
558
+ // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/
559
+ // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011
560
+ // https://developers.facebook.com/docs/sharing/best-practices
561
+ 'Bot' => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom',
562
+ 'MobileBot' => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2',
563
+ 'DesktopMode' => 'WPDesktop',
564
+ 'TV' => 'SonyDTV|HbbTV', // experimental
565
+ 'WebKit' => '(webkit)[ /]([\w.]+)',
566
+ // @todo: Include JXD consoles.
567
+ 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b',
568
+ 'Watch' => 'SM-V700',
569
+ );
570
+
571
+ /**
572
+ * All possible HTTP headers that represent the
573
+ * User-Agent string.
574
+ *
575
+ * @var array
576
+ */
577
+ protected static $uaHttpHeaders = array(
578
+ // The default User-Agent string.
579
+ 'HTTP_USER_AGENT',
580
+ // Header can occur on devices using Opera Mini.
581
+ 'HTTP_X_OPERAMINI_PHONE_UA',
582
+ // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/
583
+ 'HTTP_X_DEVICE_USER_AGENT',
584
+ 'HTTP_X_ORIGINAL_USER_AGENT',
585
+ 'HTTP_X_SKYFIRE_PHONE',
586
+ 'HTTP_X_BOLT_PHONE_UA',
587
+ 'HTTP_DEVICE_STOCK_UA',
588
+ 'HTTP_X_UCBROWSER_DEVICE_UA'
589
+ );
590
+
591
+ /**
592
+ * The individual segments that could exist in a User-Agent string. VER refers to the regular
593
+ * expression defined in the constant self::VER.
594
+ *
595
+ * @var array
596
+ */
597
+ protected static $properties = array(
598
+
599
+ // Build
600
+ 'Mobile' => 'Mobile/[VER]',
601
+ 'Build' => 'Build/[VER]',
602
+ 'Version' => 'Version/[VER]',
603
+ 'VendorID' => 'VendorID/[VER]',
604
+
605
+ // Devices
606
+ 'iPad' => 'iPad.*CPU[a-z ]+[VER]',
607
+ 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]',
608
+ 'iPod' => 'iPod.*CPU[a-z ]+[VER]',
609
+ //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'),
610
+ 'Kindle' => 'Kindle/[VER]',
611
+
612
+ // Browser
613
+ 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'),
614
+ 'Coast' => array('Coast/[VER]'),
615
+ 'Dolfin' => 'Dolfin/[VER]',
616
+ // @reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox
617
+ 'Firefox' => array('Firefox/[VER]', 'FxiOS/[VER]'),
618
+ 'Fennec' => 'Fennec/[VER]',
619
+ // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx
620
+ // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx
621
+ 'Edge' => 'Edge/[VER]',
622
+ 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'),
623
+ // http://en.wikipedia.org/wiki/NetFront
624
+ 'NetFront' => 'NetFront/[VER]',
625
+ 'NokiaBrowser' => 'NokiaBrowser/[VER]',
626
+ 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ),
627
+ 'Opera Mini' => 'Opera Mini/[VER]',
628
+ 'Opera Mobi' => 'Version/[VER]',
629
+ 'UC Browser' => 'UC Browser[VER]',
630
+ 'MQQBrowser' => 'MQQBrowser/[VER]',
631
+ 'MicroMessenger' => 'MicroMessenger/[VER]',
632
+ 'baiduboxapp' => 'baiduboxapp/[VER]',
633
+ 'baidubrowser' => 'baidubrowser/[VER]',
634
+ 'SamsungBrowser' => 'SamsungBrowser/[VER]',
635
+ 'Iron' => 'Iron/[VER]',
636
+ // @note: Safari 7534.48.3 is actually Version 5.1.
637
+ // @note: On BlackBerry the Version is overwriten by the OS.
638
+ 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ),
639
+ 'Skyfire' => 'Skyfire/[VER]',
640
+ 'Tizen' => 'Tizen/[VER]',
641
+ 'Webkit' => 'webkit[ /][VER]',
642
+ 'PaleMoon' => 'PaleMoon/[VER]',
643
+
644
+ // Engine
645
+ 'Gecko' => 'Gecko/[VER]',
646
+ 'Trident' => 'Trident/[VER]',
647
+ 'Presto' => 'Presto/[VER]',
648
+ 'Goanna' => 'Goanna/[VER]',
649
+
650
+ // OS
651
+ 'iOS' => ' \bi?OS\b [VER][ ;]{1}',
652
+ 'Android' => 'Android [VER]',
653
+ 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'),
654
+ 'BREW' => 'BREW [VER]',
655
+ 'Java' => 'Java/[VER]',
656
+ // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx
657
+ // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases
658
+ 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'),
659
+ 'Windows Phone' => 'Windows Phone [VER]',
660
+ 'Windows CE' => 'Windows CE/[VER]',
661
+ // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd
662
+ 'Windows NT' => 'Windows NT [VER]',
663
+ 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'),
664
+ 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'),
665
+ );
666
+
667
+ /**
668
+ * Construct an instance of this class.
669
+ *
670
+ * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored.
671
+ * If left empty, will use the global _SERVER['HTTP_*'] vars instead.
672
+ * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT
673
+ * from the $headers array instead.
674
+ */
675
+ public function __construct(
676
+ array $headers = null,
677
+ $userAgent = null
678
+ ) {
679
+ $this->setHttpHeaders($headers);
680
+ $this->setUserAgent($userAgent);
681
+ }
682
+
683
+ /**
684
+ * Get the current script version.
685
+ * This is useful for the demo.php file,
686
+ * so people can check on what version they are testing
687
+ * for mobile devices.
688
+ *
689
+ * @return string The version number in semantic version format.
690
+ */
691
+ public static function getScriptVersion()
692
  {
693
+ return self::VERSION;
694
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
695
 
696
+ /**
697
+ * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers.
698
+ *
699
+ * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract
700
+ * the headers. The default null is left for backwards compatibility.
701
+ */
702
+ public function setHttpHeaders($httpHeaders = null)
703
+ {
704
+ // use global _SERVER if $httpHeaders aren't defined
705
+ if (!is_array($httpHeaders) || !count($httpHeaders)) {
706
+ $httpHeaders = $_SERVER;
707
  }
708
 
709
+ // clear existing headers
710
+ $this->httpHeaders = array();
711
+
712
+ // Only save HTTP headers. In PHP land, that means only _SERVER vars that
713
+ // start with HTTP_.
714
+ foreach ($httpHeaders as $key => $value) {
715
+ if (substr($key, 0, 5) === 'HTTP_') {
716
+ $this->httpHeaders[$key] = $value;
 
 
 
717
  }
718
+ }
719
 
720
+ // In case we're dealing with CloudFront, we need to know.
721
+ $this->setCfHeaders($httpHeaders);
722
+ }
723
 
724
+ /**
725
+ * Retrieves the HTTP headers.
726
+ *
727
+ * @return array
728
+ */
729
+ public function getHttpHeaders()
730
+ {
731
+ return $this->httpHeaders;
732
+ }
733
 
734
+ /**
735
+ * Retrieves a particular header. If it doesn't exist, no exception/error is caused.
736
+ * Simply null is returned.
737
+ *
738
+ * @param string $header The name of the header to retrieve. Can be HTTP compliant such as
739
+ * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the
740
+ * all-caps, HTTP_ prefixed, underscore seperated awesomeness.
741
+ *
742
+ * @return string|null The value of the header.
743
+ */
744
+ public function getHttpHeader($header)
745
+ {
746
+ // are we using PHP-flavored headers?
747
+ if (strpos($header, '_') === false) {
748
+ $header = str_replace('-', '_', $header);
749
+ $header = strtoupper($header);
750
  }
751
 
752
+ // test the alternate, too
753
+ $altHeader = 'HTTP_' . $header;
 
 
 
 
 
 
 
754
 
755
+ //Test both the regular and the HTTP_ prefix
756
+ if (isset($this->httpHeaders[$header])) {
757
+ return $this->httpHeaders[$header];
758
+ } elseif (isset($this->httpHeaders[$altHeader])) {
759
+ return $this->httpHeaders[$altHeader];
760
+ }
 
 
 
 
 
 
 
 
 
 
 
761
 
762
+ return null;
763
+ }
764
 
765
+ public function getMobileHeaders()
766
+ {
767
+ return self::$mobileHeaders;
768
+ }
 
 
769
 
770
+ /**
771
+ * Get all possible HTTP headers that
772
+ * can contain the User-Agent string.
773
+ *
774
+ * @return array List of HTTP headers.
775
+ */
776
+ public function getUaHttpHeaders()
777
+ {
778
+ return self::$uaHttpHeaders;
779
+ }
780
 
 
 
 
 
781
 
782
+ /**
783
+ * Set CloudFront headers
784
+ * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device
785
+ *
786
+ * @param array $cfHeaders List of HTTP headers
787
+ *
788
+ * @return boolean If there were CloudFront headers to be set
789
+ */
790
+ public function setCfHeaders($cfHeaders = null) {
791
+ // use global _SERVER if $cfHeaders aren't defined
792
+ if (!is_array($cfHeaders) || !count($cfHeaders)) {
793
+ $cfHeaders = $_SERVER;
794
  }
795
 
796
+ // clear existing headers
797
+ $this->cloudfrontHeaders = array();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
798
 
799
+ // Only save CLOUDFRONT headers. In PHP land, that means only _SERVER vars that
800
+ // start with cloudfront-.
801
+ $response = false;
802
+ foreach ($cfHeaders as $key => $value) {
803
+ if (substr(strtolower($key), 0, 16) === 'http_cloudfront_') {
804
+ $this->cloudfrontHeaders[strtoupper($key)] = $value;
805
+ $response = true;
 
806
  }
 
 
807
  }
808
 
809
+ return $response;
810
+ }
 
 
 
 
 
 
 
811
 
812
+ /**
813
+ * Retrieves the cloudfront headers.
814
+ *
815
+ * @return array
816
+ */
817
+ public function getCfHeaders()
818
+ {
819
+ return $this->cloudfrontHeaders;
820
+ }
 
 
 
 
 
 
 
 
 
 
 
 
821
 
822
+ /**
823
+ * Set the User-Agent to be used.
824
+ *
825
+ * @param string $userAgent The user agent string to set.
826
+ *
827
+ * @return string|null
828
+ */
829
+ public function setUserAgent($userAgent = null)
830
+ {
831
+ // Invalidate cache due to #375
832
+ $this->cache = array();
833
+
834
+ if (false === empty($userAgent)) {
835
+ return $this->userAgent = $userAgent;
836
+ } else {
837
+ $this->userAgent = null;
838
+ foreach ($this->getUaHttpHeaders() as $altHeader) {
839
+ if (false === empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban)
840
+ $this->userAgent .= $this->httpHeaders[$altHeader] . " ";
841
  }
842
  }
843
 
844
+ if (!empty($this->userAgent)) {
845
+ return $this->userAgent = trim($this->userAgent);
846
  }
 
847
  }
848
 
849
+ if (count($this->getCfHeaders()) > 0) {
850
+ return $this->userAgent = 'Amazon CloudFront';
 
 
 
 
 
 
851
  }
852
+ return $this->userAgent = null;
853
+ }
854
 
855
+ /**
856
+ * Retrieve the User-Agent.
857
+ *
858
+ * @return string|null The user agent if it's set.
859
+ */
860
+ public function getUserAgent()
861
+ {
862
+ return $this->userAgent;
863
+ }
 
 
 
 
 
 
 
 
 
864
 
865
+ /**
866
+ * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or
867
+ * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set.
868
+ *
869
+ * @deprecated since version 2.6.9
870
+ *
871
+ * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default
872
+ * parameter is null which will default to self::DETECTION_TYPE_MOBILE.
873
+ */
874
+ public function setDetectionType($type = null)
875
+ {
876
+ if ($type === null) {
877
+ $type = self::DETECTION_TYPE_MOBILE;
878
  }
879
 
880
+ if ($type !== self::DETECTION_TYPE_MOBILE && $type !== self::DETECTION_TYPE_EXTENDED) {
881
+ return;
 
882
  }
883
 
884
+ $this->detectionType = $type;
885
+ }
 
 
886
 
887
+ public function getMatchingRegex()
888
+ {
889
+ return $this->matchingRegex;
890
+ }
 
 
 
 
 
891
 
892
+ public function getMatchesArray()
893
+ {
894
+ return $this->matchesArray;
895
+ }
 
 
 
 
 
896
 
897
+ /**
898
+ * Retrieve the list of known phone devices.
899
+ *
900
+ * @return array List of phone devices.
901
+ */
902
+ public static function getPhoneDevices()
903
+ {
904
+ return self::$phoneDevices;
905
+ }
906
 
907
+ /**
908
+ * Retrieve the list of known tablet devices.
909
+ *
910
+ * @return array List of tablet devices.
911
+ */
912
+ public static function getTabletDevices()
913
+ {
914
+ return self::$tabletDevices;
915
+ }
916
 
917
+ /**
918
+ * Alias for getBrowsers() method.
919
+ *
920
+ * @return array List of user agents.
921
+ */
922
+ public static function getUserAgents()
923
+ {
924
+ return self::getBrowsers();
925
+ }
926
 
927
+ /**
928
+ * Retrieve the list of known browsers. Specifically, the user agents.
929
+ *
930
+ * @return array List of browsers / user agents.
931
+ */
932
+ public static function getBrowsers()
933
+ {
934
+ return self::$browsers;
935
+ }
 
 
 
 
 
 
 
 
 
 
936
 
937
+ /**
938
+ * Retrieve the list of known utilities.
939
+ *
940
+ * @return array List of utilities.
941
+ */
942
+ public static function getUtilities()
943
+ {
944
+ return self::$utilities;
945
+ }
946
 
947
+ /**
948
+ * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*().
949
+ *
950
+ * @deprecated since version 2.6.9
951
+ *
952
+ * @return array All the rules (but not extended).
953
+ */
954
+ public static function getMobileDetectionRules()
955
+ {
956
+ static $rules;
957
+
958
+ if (!$rules) {
959
+ $rules = array_merge(
960
+ self::$phoneDevices,
961
+ self::$tabletDevices,
962
+ self::$operatingSystems,
963
+ self::$browsers
964
+ );
965
  }
966
 
967
+ return $rules;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
968
 
969
+ }
 
970
 
971
+ /**
972
+ * Method gets the mobile detection rules + utilities.
973
+ * The reason this is separate is because utilities rules
974
+ * don't necessary imply mobile. This method is used inside
975
+ * the new $detect->is('stuff') method.
976
+ *
977
+ * @deprecated since version 2.6.9
978
+ *
979
+ * @return array All the rules + extended.
980
+ */
981
+ public function getMobileDetectionRulesExtended()
982
+ {
983
+ static $rules;
984
+
985
+ if (!$rules) {
986
+ // Merge all rules together.
987
+ $rules = array_merge(
988
+ self::$phoneDevices,
989
+ self::$tabletDevices,
990
+ self::$operatingSystems,
991
+ self::$browsers,
992
+ self::$utilities
993
+ );
994
  }
995
 
996
+ return $rules;
997
+ }
998
+
999
+ /**
1000
+ * Retrieve the current set of rules.
1001
+ *
1002
+ * @deprecated since version 2.6.9
1003
+ *
1004
+ * @return array
1005
+ */
1006
+ public function getRules()
1007
+ {
1008
+ if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) {
1009
+ return self::getMobileDetectionRulesExtended();
1010
+ } else {
1011
+ return self::getMobileDetectionRules();
1012
  }
1013
+ }
1014
 
1015
+ /**
1016
+ * Retrieve the list of mobile operating systems.
1017
+ *
1018
+ * @return array The list of mobile operating systems.
1019
+ */
1020
+ public static function getOperatingSystems()
1021
+ {
1022
+ return self::$operatingSystems;
1023
+ }
1024
+
1025
+ /**
1026
+ * Check the HTTP headers for signs of mobile.
1027
+ * This is the fastest mobile check possible; it's used
1028
+ * inside isMobile() method.
1029
+ *
1030
+ * @return bool
1031
+ */
1032
+ public function checkHttpHeadersForMobile()
1033
+ {
1034
 
1035
+ foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) {
1036
+ if (isset($this->httpHeaders[$mobileHeader])) {
1037
+ if (is_array($matchType['matches'])) {
1038
+ foreach ($matchType['matches'] as $_match) {
1039
+ if (strpos($this->httpHeaders[$mobileHeader], $_match) !== false) {
1040
+ return true;
1041
+ }
1042
  }
1043
+
1044
+ return false;
1045
+ } else {
1046
+ return true;
1047
  }
1048
  }
 
 
 
1049
  }
1050
 
1051
+ return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1052
 
1053
+ }
1054
 
1055
+ /**
1056
+ * Magic overloading method.
1057
+ *
1058
+ * @method boolean is[...]()
1059
+ * @param string $name
1060
+ * @param array $arguments
1061
+ * @return mixed
1062
+ * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is'
1063
+ */
1064
+ public function __call($name, $arguments)
1065
+ {
1066
+ // make sure the name starts with 'is', otherwise
1067
+ if (substr($name, 0, 2) !== 'is') {
1068
+ throw new BadMethodCallException("No such method exists: $name");
1069
  }
1070
 
1071
+ $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
 
 
 
 
 
 
 
 
 
 
 
 
1072
 
1073
+ $key = substr($name, 2);
1074
+
1075
+ return $this->matchUAAgainstKey($key);
1076
+ }
1077
+
1078
+ /**
1079
+ * Find a detection rule that matches the current User-agent.
1080
+ *
1081
+ * @param null $userAgent deprecated
1082
+ * @return boolean
1083
+ */
1084
+ protected function matchDetectionRulesAgainstUA($userAgent = null)
1085
+ {
1086
+ // Begin general search.
1087
+ foreach ($this->getRules() as $_regex) {
1088
+ if (empty($_regex)) {
1089
+ continue;
1090
  }
1091
 
1092
+ if ($this->match($_regex, $userAgent)) {
1093
+ return true;
1094
+ }
1095
  }
1096
 
1097
+ return false;
1098
+ }
 
 
 
 
 
 
 
 
 
 
 
 
1099
 
1100
+ /**
1101
+ * Search for a certain key in the rules array.
1102
+ * If the key is found then try to match the corresponding
1103
+ * regex against the User-Agent.
1104
+ *
1105
+ * @param string $key
1106
+ *
1107
+ * @return boolean
1108
+ */
1109
+ protected function matchUAAgainstKey($key)
1110
+ {
1111
+ // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc.
1112
+ $key = strtolower($key);
1113
+ if (false === isset($this->cache[$key])) {
1114
 
1115
+ // change the keys to lower case
1116
+ $_rules = array_change_key_case($this->getRules());
 
1117
 
1118
+ if (false === empty($_rules[$key])) {
1119
+ $this->cache[$key] = $this->match($_rules[$key]);
 
1120
  }
1121
 
1122
+ if (false === isset($this->cache[$key])) {
1123
+ $this->cache[$key] = false;
1124
+ }
1125
  }
1126
 
1127
+ return $this->cache[$key];
1128
+ }
 
 
 
 
 
 
 
 
 
 
 
1129
 
1130
+ /**
1131
+ * Check if the device is mobile.
1132
+ * Returns true if any type of mobile device detected, including special ones
1133
+ * @param null $userAgent deprecated
1134
+ * @param null $httpHeaders deprecated
1135
+ * @return bool
1136
+ */
1137
+ public function isMobile($userAgent = null, $httpHeaders = null)
1138
+ {
1139
 
1140
+ if ($httpHeaders) {
1141
+ $this->setHttpHeaders($httpHeaders);
1142
+ }
 
 
 
 
1143
 
1144
+ if ($userAgent) {
1145
+ $this->setUserAgent($userAgent);
1146
+ }
1147
 
1148
+ // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront'
1149
+ if ($this->getUserAgent() === 'Amazon CloudFront') {
1150
+ $cfHeaders = $this->getCfHeaders();
1151
+ if(array_key_exists('HTTP_CLOUDFRONT_IS_MOBILE_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER'] === 'true') {
1152
  return true;
 
 
1153
  }
 
1154
  }
1155
 
1156
+ $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1157
 
1158
+ if ($this->checkHttpHeadersForMobile()) {
1159
+ return true;
1160
+ } else {
1161
+ return $this->matchDetectionRulesAgainstUA();
1162
+ }
1163
 
1164
+ }
 
 
 
 
1165
 
1166
+ /**
1167
+ * Check if the device is a tablet.
1168
+ * Return true if any type of tablet device is detected.
1169
+ *
1170
+ * @param string $userAgent deprecated
1171
+ * @param array $httpHeaders deprecated
1172
+ * @return bool
1173
+ */
1174
+ public function isTablet($userAgent = null, $httpHeaders = null)
1175
+ {
1176
+ // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront'
1177
+ if ($this->getUserAgent() === 'Amazon CloudFront') {
1178
+ $cfHeaders = $this->getCfHeaders();
1179
+ if(array_key_exists('HTTP_CLOUDFRONT_IS_TABLET_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_TABLET_VIEWER'] === 'true') {
1180
+ return true;
1181
+ }
1182
  }
1183
 
1184
+ $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1185
 
1186
+ foreach (self::$tabletDevices as $_regex) {
1187
+ if ($this->match($_regex, $userAgent)) {
1188
+ return true;
1189
  }
1190
+ }
1191
 
1192
+ return false;
1193
+ }
1194
 
1195
+ /**
1196
+ * This method checks for a certain property in the
1197
+ * userAgent.
1198
+ * @todo: The httpHeaders part is not yet used.
1199
+ *
1200
+ * @param string $key
1201
+ * @param string $userAgent deprecated
1202
+ * @param string $httpHeaders deprecated
1203
+ * @return bool|int|null
1204
+ */
1205
+ public function is($key, $userAgent = null, $httpHeaders = null)
1206
+ {
1207
+ // Set the UA and HTTP headers only if needed (eg. batch mode).
1208
+ if ($httpHeaders) {
1209
+ $this->setHttpHeaders($httpHeaders);
1210
  }
1211
 
1212
+ if ($userAgent) {
1213
+ $this->setUserAgent($userAgent);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1214
  }
1215
 
1216
+ $this->setDetectionType(self::DETECTION_TYPE_EXTENDED);
1217
+
1218
+ return $this->matchUAAgainstKey($key);
1219
+ }
1220
+
1221
+ /**
1222
+ * Some detection rules are relative (not standard),
1223
+ * because of the diversity of devices, vendors and
1224
+ * their conventions in representing the User-Agent or
1225
+ * the HTTP headers.
1226
+ *
1227
+ * This method will be used to check custom regexes against
1228
+ * the User-Agent string.
1229
+ *
1230
+ * @param $regex
1231
+ * @param string $userAgent
1232
+ * @return bool
1233
+ *
1234
+ * @todo: search in the HTTP headers too.
1235
+ */
1236
+ public function match($regex, $userAgent = null)
1237
+ {
1238
+ $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches);
1239
+ // If positive match is found, store the results for debug.
1240
+ if ($match) {
1241
+ $this->matchingRegex = $regex;
1242
+ $this->matchesArray = $matches;
1243
  }
1244
 
1245
+ return $match;
1246
+ }
1247
+
1248
+ /**
1249
+ * Get the properties array.
1250
+ *
1251
+ * @return array
1252
+ */
1253
+ public static function getProperties()
1254
+ {
1255
+ return self::$properties;
1256
+ }
 
 
 
 
 
1257
 
1258
+ /**
1259
+ * Prepare the version number.
1260
+ *
1261
+ * @todo Remove the error supression from str_replace() call.
1262
+ *
1263
+ * @param string $ver The string version, like "2.6.21.2152";
1264
+ *
1265
+ * @return float
1266
+ */
1267
+ public function prepareVersionNo($ver)
1268
+ {
1269
+ $ver = str_replace(array('_', ' ', '/'), '.', $ver);
1270
+ $arrVer = explode('.', $ver, 2);
1271
+
1272
+ if (isset($arrVer[1])) {
1273
+ $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions.
1274
  }
1275
 
1276
+ return (float) implode('.', $arrVer);
1277
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1278
 
1279
+ /**
1280
+ * Check the version of the given property in the User-Agent.
1281
+ * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31)
1282
+ *
1283
+ * @param string $propertyName The name of the property. See self::getProperties() array
1284
+ * keys for all possible properties.
1285
+ * @param string $type Either self::VERSION_TYPE_STRING to get a string value or
1286
+ * self::VERSION_TYPE_FLOAT indicating a float value. This parameter
1287
+ * is optional and defaults to self::VERSION_TYPE_STRING. Passing an
1288
+ * invalid parameter will default to the this type as well.
1289
+ *
1290
+ * @return string|float The version of the property we are trying to extract.
1291
+ */
1292
+ public function version($propertyName, $type = self::VERSION_TYPE_STRING)
1293
+ {
1294
+ if (empty($propertyName)) {
1295
+ return false;
1296
+ }
1297
 
1298
+ // set the $type to the default if we don't recognize the type
1299
+ if ($type !== self::VERSION_TYPE_STRING && $type !== self::VERSION_TYPE_FLOAT) {
1300
+ $type = self::VERSION_TYPE_STRING;
1301
+ }
1302
 
1303
+ $properties = self::getProperties();
 
1304
 
1305
+ // Check if the property exists in the properties array.
1306
+ if (true === isset($properties[$propertyName])) {
 
1307
 
1308
+ // Prepare the pattern to be matched.
1309
+ // Make sure we always deal with an array (string is converted).
1310
+ $properties[$propertyName] = (array) $properties[$propertyName];
1311
 
1312
+ foreach ($properties[$propertyName] as $propertyMatchString) {
1313
 
1314
+ $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString);
 
1315
 
1316
+ // Identify and extract the version.
1317
+ preg_match(sprintf('#%s#is', $propertyPattern), $this->userAgent, $match);
1318
 
1319
+ if (false === empty($match[1])) {
1320
+ $version = ($type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1]);
1321
 
1322
+ return $version;
1323
  }
1324
 
1325
  }
1326
 
 
1327
  }
1328
 
1329
+ return false;
1330
+ }
 
 
 
 
 
 
1331
 
1332
+ /**
1333
+ * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants.
1334
+ *
1335
+ * @return string One of the self::MOBILE_GRADE_* constants.
1336
+ */
1337
+ public function mobileGrade()
1338
+ {
1339
+ $isMobile = $this->isMobile();
1340
 
1341
+ if (
1342
+ // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0)
1343
+ $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) >= 4.3 ||
1344
+ $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) >= 4.3 ||
1345
+ $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) >= 4.3 ||
1346
 
1347
+ // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5)
1348
+ // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM
1349
+ // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices
1350
+ // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7
1351
+ ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) ||
1352
 
1353
+ // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8)
1354
+ $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT) >= 7.5 ||
 
 
1355
 
1356
+ // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10)
1357
+ $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 6.0 ||
1358
+ // Blackberry Playbook (1.0-2.0) - Tested on PlayBook
1359
+ $this->match('Playbook.*Tablet') ||
1360
 
1361
+ // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0)
1362
+ ( $this->version('webOS', self::VERSION_TYPE_FLOAT) >= 1.4 && $this->match('Palm|Pre|Pixi') ) ||
1363
+ // Palm WebOS 3.0 - Tested on HP TouchPad
1364
+ $this->match('hp.*TouchPad') ||
1365
 
1366
+ // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices
1367
+ ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 18 ) ||
1368
 
1369
+ // Chrome for Android - Tested on Android 4.0, 4.1 device
1370
+ ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 4.0 ) ||
1371
 
1372
+ // Skyfire 4.1 - Tested on Android 2.3 device
1373
+ ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT) >= 4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) ||
1374
 
1375
+ // Opera Mobile 11.5-12: Tested on Android 2.3
1376
+ ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11.5 && $this->is('AndroidOS') ) ||
1377
 
1378
+ // Meego 1.2 - Tested on Nokia 950 and N9
1379
+ $this->is('MeeGoOS') ||
1380
 
1381
+ // Tizen (pre-release) - Tested on early hardware
1382
+ $this->is('Tizen') ||
 
1383
 
1384
+ // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser
1385
+ // @todo: more tests here!
1386
+ $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT) >= 2.0 ||
1387
 
1388
+ // UC Browser - Tested on Android 2.3 device
1389
+ ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) ||
 
1390
 
1391
+ // Kindle 3 and Fire - Tested on the built-in WebKit browser for each
1392
+ ( $this->match('Kindle Fire') ||
1393
+ $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT) >= 3.0 ) ||
1394
 
1395
+ // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet
1396
+ $this->is('AndroidOS') && $this->is('NookTablet') ||
1397
 
1398
+ // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7
1399
+ $this->version('Chrome', self::VERSION_TYPE_FLOAT) >= 16 && !$isMobile ||
1400
 
1401
+ // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7
1402
+ $this->version('Safari', self::VERSION_TYPE_FLOAT) >= 5.0 && !$isMobile ||
1403
 
1404
+ // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7
1405
+ $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 10.0 && !$isMobile ||
1406
 
1407
+ // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7
1408
+ $this->version('IE', self::VERSION_TYPE_FLOAT) >= 7.0 && !$isMobile ||
 
 
 
1409
 
1410
+ // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7
1411
+ $this->version('Opera', self::VERSION_TYPE_FLOAT) >= 10 && !$isMobile
1412
+ ){
1413
+ return self::MOBILE_GRADE_A;
1414
+ }
1415
 
1416
+ if (
1417
+ $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 ||
1418
+ $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 ||
1419
+ $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 ||
1420
 
1421
+ // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770
1422
+ $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 ||
 
1423
 
1424
+ //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3
1425
+ ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT) >= 5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT) <= 7.0 &&
1426
+ ($this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 || $this->is('iOS')) ) ||
1427
 
1428
+ // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1)
1429
+ $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') ||
 
 
 
1430
 
1431
+ // @todo: report this (tested on Nokia N71)
1432
+ $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11 && $this->is('SymbianOS')
1433
+ ){
1434
+ return self::MOBILE_GRADE_B;
1435
+ }
1436
+
1437
+ if (
1438
+ // Blackberry 4.x - Tested on the Curve 8330
1439
+ $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) <= 5.0 ||
1440
+ // Windows Mobile - Tested on the HTC Leo (WinMo 5.2)
1441
+ $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT) <= 5.2 ||
 
 
 
 
 
1442
 
1443
+ // Tested on original iPhone (3.1), iPhone 3 (3.2)
1444
+ $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) <= 3.2 ||
1445
+ $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) <= 3.2 ||
1446
+ $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) <= 3.2 ||
1447
+
1448
+ // Internet Explorer 7 and older - Tested on Windows XP
1449
+ $this->version('IE', self::VERSION_TYPE_FLOAT) <= 7.0 && !$isMobile
1450
+ ){
1451
  return self::MOBILE_GRADE_C;
1452
  }
1453
+
1454
+ // All older smartphone platforms and featurephones - Any device that doesn't support media queries
1455
+ // will receive the basic, C grade experience.
1456
+ return self::MOBILE_GRADE_C;
1457
  }
1458
  }
icegram.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Icegram - Popups, Optins, CTAs & lot more...
4
  * Plugin URI: http://www.icegram.com/
5
  * Description: All in one solution to inspire, convert and engage your audiences. Action bars, Popup windows, Messengers, Toast notifications and more. Awesome themes and powerful rules.
6
- * Version: 1.10.1
7
  * Author: icegram
8
  * Author URI: http://www.icegram.com/
9
  * Copyright (c) 2014-16 Icegram
@@ -34,7 +34,7 @@ class Icegram {
34
 
35
  function __construct() {
36
 
37
- $this->version = "1.10.1";
38
  $this->shortcode_instances = array();
39
  $this->mode = 'local';
40
  $this->plugin_url = untrailingslashit( plugins_url( '/', __FILE__ ) );
@@ -697,6 +697,12 @@ class Icegram {
697
  $action_bar['label'] = __('Show More', 'icegram');
698
  $action_bar['id'] = $action_bar['id'].'_00';
699
  $action_bar['use_custom_code'] = 'yes';
 
 
 
 
 
 
700
  $action_bar['custom_css'] = '#ig_this_message .ig_close{display:none;}';
701
  $action_bar['custom_js'] = "<script type='text/javascript'>jQuery('#icegram_message_".$action_bar['id']."').on('click', '.ig_button', function(){icegram.get_message_by_id('".$action_bar['id']."').hide(); icegram.get_message_by_id('".$message['id']."').show(); });</script>";
702
  unset($action_bar['ig_mobile_popup']);
3
  * Plugin Name: Icegram - Popups, Optins, CTAs & lot more...
4
  * Plugin URI: http://www.icegram.com/
5
  * Description: All in one solution to inspire, convert and engage your audiences. Action bars, Popup windows, Messengers, Toast notifications and more. Awesome themes and powerful rules.
6
+ * Version: 1.10.2
7
  * Author: icegram
8
  * Author URI: http://www.icegram.com/
9
  * Copyright (c) 2014-16 Icegram
34
 
35
  function __construct() {
36
 
37
+ $this->version = "1.10.2";
38
  $this->shortcode_instances = array();
39
  $this->mode = 'local';
40
  $this->plugin_url = untrailingslashit( plugins_url( '/', __FILE__ ) );
697
  $action_bar['label'] = __('Show More', 'icegram');
698
  $action_bar['id'] = $action_bar['id'].'_00';
699
  $action_bar['use_custom_code'] = 'yes';
700
+ $action_bar['form_html'] = '';
701
+ $action_bar['form_html_original'] = '';
702
+ $action_bar['rainmaker_form_code'] = '';
703
+ $action_bar['link'] = '';
704
+ $action_bar['redirect_to_link'] = '';
705
+ $action_bar['cta'] = '';
706
  $action_bar['custom_css'] = '#ig_this_message .ig_close{display:none;}';
707
  $action_bar['custom_js'] = "<script type='text/javascript'>jQuery('#icegram_message_".$action_bar['id']."').on('click', '.ig_button', function(){icegram.get_message_by_id('".$action_bar['id']."').hide(); icegram.get_message_by_id('".$message['id']."').show(); });</script>";
708
  unset($action_bar['ig_mobile_popup']);
readme.txt CHANGED
@@ -1,12 +1,11 @@
1
- === All in One Email Optin, Popup, Subscription and Traffic Conversion Plugin - Icegram ===
2
  Contributors: icegram, storeapps, niravmehta, putler
3
  Donate link: http://www.icegram.com/
4
- Tags: popup, window, hellobar, optin, lead capture, marketing, form, notification, messenger, targeting, monster, ninja ,wordpress lead generation, wordpress lightbox optin, wordpress lightbox optin form, wordpress lightbox optins, wordpress mobile optin forms, wordpress mobile popup, wordpress mobile popups, wordpress optin form, wordpress overlay popup, wordpress popup, wordpress popup form, wordpress popup plugin, wordpress popup solution, wordpress popups , popups, subscribe, wp popups, optin bars, action grabber, constant contact, toast notifications, leads, lists, builder, action bar, floating bar, footer bar, hellobar alternative, pop over, Popup plugin, aweber, campaign monitor, constant contact, email list, exit-intent, getresponse, analytics, Hubspot, icontact, infusionsoft, newsletter, Mailing list pop-up, retargeting, Animation,Popups with Animation ,Responsive Popup, split testing, AB testing
5
  Requires at least: 3.9
6
- Tested up to: 4.7
7
- Stable tag: 1.10.1
8
  License: GPLv3
9
- License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
11
  Grow your subscriber list, engage and convert visitors, decrease bounce rate with this best in class plugin. Proven, easy to use & well supported.
12
 
@@ -209,6 +208,9 @@ Contact Us, provide as much detail of the problem as you can. We will try to sol
209
  5. Target your Icegram message using these display rules
210
 
211
  == Upgrade Notice ==
 
 
 
212
  = 1.10.1 =
213
  Bug Fix release
214
 
@@ -367,6 +369,11 @@ Initial Release
367
 
368
 
369
  == Changelog ==
 
 
 
 
 
370
  = 1.10.1 =
371
  * Fix: Action bar was not getting close.
372
 
1
+ === Popups, Welcome Bar, Optins and Lead Generation Plugin - Icegram ===
2
  Contributors: icegram, storeapps, niravmehta, putler
3
  Donate link: http://www.icegram.com/
4
+ Tags: popup, hellobar, optin, lead capture, marketing, form, notification, messenger, targeting, monster, ninja ,wordpress lead generation, wordpress lightbox optin, wordpress lightbox optin form, wordpress lightbox optins, wordpress mobile optin forms, wordpress mobile popup, wordpress mobile popups, wordpress optin form, wordpress overlay popup, wordpress popup, wordpress popup form, wordpress popup plugin, wordpress popup solution, wordpress popups , popups, subscribe, wp popups, optin bars, action grabber, constant contact, toast notifications, leads, lists, builder, action bar, floating bar, footer bar, hellobar alternative, pop over, Popup plugin, aweber, campaign monitor, constant contact, email list, exit-intent, getresponse, analytics, Hubspot, icontact, infusionsoft, newsletter, Mailing list pop-up, retargeting, Animation,Popups with Animation ,Responsive Popup, split testing, AB testing
5
  Requires at least: 3.9
6
+ Tested up to: 4.7.2
7
+ Stable tag: 1.10.2
8
  License: GPLv3
 
9
 
10
  Grow your subscriber list, engage and convert visitors, decrease bounce rate with this best in class plugin. Proven, easy to use & well supported.
11
 
208
  5. Target your Icegram message using these display rules
209
 
210
  == Upgrade Notice ==
211
+ = 1.10.2 =
212
+ Update mobile Detect library
213
+
214
  = 1.10.1 =
215
  Bug Fix release
216
 
369
 
370
 
371
  == Changelog ==
372
+ = 1.10.2 =
373
+ * Update: Mobile Detect Library updated to version 2.8.24
374
+ * Fix: Forms that were embedded in mobile popups at "0 seconds"
375
+ * Fix: Resolve conflicts with wordpress themes using Magnific popup library
376
+
377
  = 1.10.1 =
378
  * Fix: Action bar was not getting close.
379