// メール送信
// [form dialog.error]と[form dialog.success]のスタイルが必要
$.fn.sendmail = function(title){
var
$form = this,
action = $form.attr('action'),
method = $form.attr('method'),
delimiter = ',';
$form.on({
submit: function(){
var dat = {}, errors = [], message = '';
// データ取得[name, value, field, required]
$.each($form.serializeArray(), function(i, item){
if($.type(dat[item.name]) === 'undefined') dat[item.name] = [];
$.extend(item, {
field: $.type($form.find('[name="' + item.name + '"]').attr('data-field')) === 'undefined' ? '' : $form.find('[name="' + item.name + '"]').attr('data-field'),
required: $.type($form.find('[name="' + item.name + '"]').attr('required')) === 'undefined' ? false : true
});
if(item.required && (item.value === false || item.value === '')) errors.push(item.field + 'は必須項目です。');
dat[item.name].push(item);
});
// 複数項目をデリミタで集約
$.each(dat, function(i, item){
if(item.length > 1){
var values = [], host = dat[i][0];
$.each(item, function(){
values.push(this.value);
});
host.value = values.join(delimiter);
dat[i] = host;
} else {
dat[i] = dat[i][0];
}
});
// メールアドレスチェック
$form.find('[name]').filter('[type="email"]').each(function(){
if(!$(this).val().match(/^[A-Za-z0-9]+[\w-]+@[\w\.-]+\.\w{2,}$/)) errors.push($(this).data('field') + 'の書式が正しくありません。');
});
// 本文作成
$.each(dat, function(i, item){
message += item.field + ':' + item.value + "\n";
});
// エラー出力初期化
$form.children('dialog').remove();
// ダイアログ作成 dialog.関数名(タイトル, 通知文, 0[OK]か1[OK/CANCEL])
var dialog = {
makeinterface: function(iflg){
var $interface = $();
switch(iflg){
case 1:
$interface = $('
').addClass('layout').append(
$('').addClass('twin').append(
$('', { type: 'button', value: 'Cancel' }).on({
click: function(){
$form.find('dialog').fadeOut(1000, function(){
$(this).remove();
})
}
})
)
);
break;
default:
$interface = $('').addClass('layout').append(
$('').append(
$('', { type: 'button', value: 'OK' }).on({
click: function(){
$form.find('dialog').fadeOut(1000, function(){
$(this).remove();
})
}
})
)
);
}
return $interface;
},
success: function(title, message, iflg){
var $interface = dialog.makeinterface(iflg);
$form.append(
$('').addClass('success').append([
$('').html(title),
$('').append(
$('').append(
$('').html(message)
)
),
$('').html($interface)
])
);
},
error: function(title, message, iflg){
var $interface = dialog.makeinterface(iflg);
$form.append(
$('').addClass('error').append([
$('').html(title),
$('').append(
$('').append(
$('').html(message)
)
),
$('').html($interface)
])
);
}
};
// エラーが存在する時:終了
if(errors.length > 0){
dialog.error('メールの送信', $('').append(function(){
var $res = $();
$.each(errors, function(key, val){
$res = $res.add($('').html(val));
});
return $res;
}), 0);
// エラーが存在しない時:送信
} else {
$.ajax({
type: method,
url : action,
data : { title: title, message: message }
}).done(function(resobj){
dialog[resobj.header ? 'success' : 'error']('メールの送信', resobj.res, 0);
$form.find('textarea, :text, select, [type="email"]').val('').end().find(':checked').prop('checked', false);
}).fail(function(){
dialog.error('メールの送信', '通信に失敗しました。', 0);
});
}
return false;
}
});
};
/**
* モバイル判定
* @description モバイルデバイス判定
----------------------------------------------------------------*/
$.isMobile = {
android: function(){
return (function(ua){ return (ua.indexOf('ANDROID') != -1 && ua.indexOf('MOBILE') != -1) ? true : false; })(navigator.userAgent.toUpperCase());
},
androidTablet:function(){
return (function(ua){ return (ua.indexOf('ANDROID') != -1 && ua.indexOf('MOBILE') == -1) ? true : false; })(navigator.userAgent.toUpperCase());
},
iphone:function(){
return (function(ua){ return (ua.indexOf('IPHONE') != -1 && ua.indexOf('IPAD') == -1) ? true : false; })(navigator.userAgent.toUpperCase());
},
ipad:function(){
return (function(ua){ return (ua.indexOf('IPHONE') == -1 && ua.indexOf('IPAD') != -1) ? true : false; })(navigator.userAgent.toUpperCase());
},
mobile:function(){
return ($.isMobile.android() || $.isMobile.iphone()) ? true : false;
},
tablet:function(){
return ($.isMobile.androidTablet() || $.isMobile.ipad()) ? true : false;
},
touchDevice:function(){
return ($.isMobile.mobile() || $.isMobile.tablet()) ? true : false;
}
};
/**
* DOM登録/DOM作成
* @description [case A] $.$にDOMを登録
* @description [case B] DOMを作成
* @param [case A] selectors セレクタオブジェクト
* @param [case B] tagname タグ名
* @param [case B] props 属性オブジェクト
* @return [case B] 作成されたDOM
----------------------------------------------------------------------------------------------------*/
$.$ = function(selectors){
if($.type(arguments[0]) === 'object'){
var selectors = arguments[0];
$.each(selectors, function(key, selector){
$.$[key] = selector === true ? $('#' + key) : $(selector);
});
} else {
var
tagname = arguments[0],
props = arguments[1] || {};
return $('<' + tagname + ' />', props);
}
};
/**
* 全DOM取得
* @description $.$に登録されているdomを全て取得
* @return 全DOMオブジェクト
----------------------------------------------------------------------------------------------------*/
$.get$ = function(){
var res = {};
$.each($.$, function(key, selector){
res[key] = selector;
});
return res;
};
/**
* オブジェクトリデュース
* @description オブジェクトをリデュースする
* @param fn コールバック関数
* @param prev 現在までの蓄積された結果
* @param cur 現在の値
* @param key 現在のキー
* @param obj 元配列
* @return リデュース済オブジェクト
----------------------------------------------------------------------------------------------------*/
$.reduce = function(obj, fn, init){
var res = init || [];
$.each(obj, function(key, val){
res = fn(res, val, key, obj);
});
return res;
};
/**
* バリデータ
----------------------------------------------------------------------------------------------------*/
$.isdefined = function(arg){
return $.type(arg) === 'undefined' ? false : true;
};
$.isundefined = function(arg){
return $.type(arg) === 'undefined' ? true : false;
};
/**
* 遅延実行
----------------------------------------------------------------------------------------------------*/
$.delay = function(interval, fn){
setTimeout(fn, interval);
};
/**
* インターバル実行
----------------------------------------------------------------------------------------------------*/
$.interval = function(interval, fn){
setInterval(fn, interval);
fn();
};
/**
* ライトボックス v1.1 2014.06.12
----------------------------------------------------------------------------------------------------*/
$.lightbox = function(src, alt){
$('body').append(
$.$('dialog').css({
zIndex: 10000,
position: 'fixed',
background: 'rgba(0,0,0,.7)',
top: 0,
right: 0,
bottom: 0,
left: 0,
display: 'block',
opacity: 0,
width: '100%'
}).append(
$.$('div').css({
position: 'fixed',
top: '50%',
left: '50%'
}).append(
$.$('img', { src: src, alt: alt }).css({
maxWidth: '200%'
}).load(function(){
var w = $(this).width(), h = $(this).height();
$(this).css({ marginLeft: -w/2, marginTop: -h/2 }).parent().parent().animate({ opacity: 1 }, 1000);
})
)
).on({
click: function(){
$(this).animate({ opacity: 0 }, 500, function(){
$(this).remove();
});
}
})
);
};
// 訪問時限定アニメーション
// 訪問済クッキーが存在しない時、オープニングアニメーションが実行されてからn分後にクッキー削除
$.limited = function(cookieID, limit, firstfn, visitedfn){
if(document.cookie.indexOf(cookieID) === -1){
firstfn();
document.cookie = cookieID + '; max-age=' + 60*limit;
} else {
visitedfn();
}
};
// 初期値自動取得型アニメーション
$.fn.inimate = function(preset, lag, time, fn){
var $tar = this, init = {}, landing = {}, reset = {};
if($tar.length === 0) return this;
if($.type(time) === 'undefined') time = 500;
if($.type(lag) === 'undefined') lag = 0;
if($.type(fn) === 'undefined') fn = function(){};
$.each(preset, function(attr, val){
landing[attr] = val;
init[attr] = $.type($tar.css(attr)) === 'undefined' ? '' : $tar.css(attr);
reset[attr] = '';
});
$tar.css(landing).delay(lag).animate(init, time, function(){
$(this).css(reset);
});
return this;
};
// 背景画像読み込み完了イベント
// data-bgloadを含むDOMにbackground-image読み込み完了イベントを付加
$.fn.bgload = function(fn){
var ns = 'bgload';
if($.type(fn) === 'undefined') fn = function(){};
this.each(function(){
var
$tar = $(this),
bgimg = $tar.data(ns),
$bgimg = $('', { name: 'bgload', src: bgimg }).hide().on({
load: function(){
$tar.css({ backgroundImage: 'url("' + bgimg + '")' });
$(this).remove();
fn();
}
});
if($.type(bgimg) === 'undefined') return true;
$tar.removeAttr('data-' + ns).append($bgimg);
});
};
$(function(){
var
$slider = $('#slider'),
$bun = $slider.children('article').children('ul'),
$thumb = $slider.children('footer').children('ul'),
$l = $slider.children('article').children('.l'),
$r = $slider.children('article').children('.r'),
$totop = $('#totop'),
getClass = function($dom){
if($dom.hasClass('x-2')) return 'x-2';
if($dom.hasClass('x-1')) return 'x-1';
if($dom.hasClass('x0')) return 'x0';
if($dom.hasClass('x1')) return 'x1';
if($dom.hasClass('x2')) return 'x2';
return false;
},
getPos = function($dom){
if($dom.hasClass('x-2')) return -2;
if($dom.hasClass('x-1')) return -1;
if($dom.hasClass('x0')) return 0;
if($dom.hasClass('x1')) return 1;
if($dom.hasClass('x2')) return 2;
return false;
},
ytplayer = null,
slide = function(n){
if(n === 0) return;
var
limit = 3,
abs = Math.abs(n),
man = n > 0 ? 1 : -1,
i = 0,
logic = function(){
var fn = function(){
var
$tar = $(this),
pos = getPos($tar),
newpos = pos + man;
if(Math.abs(newpos) === limit) newpos = pos*(-1);
var
oldclass = getClass($tar),
newclass = 'x' + newpos;
$tar.switchClass(oldclass, newclass, 300);
};
$bun.children('li').each(fn);
$thumb.children('li').each(fn);
i++;
if(i < abs) setTimeout(logic, 300);
};
logic();
},
fadeout = function(){
$(this).stop(true).animate({ opacity: .5 }, 300);
},
fadein = function(){
$(this).animate({ opacity: 1 }, 300);
},
player = {
timer: [],
start: function(){
player.timer.push(setInterval(function(){
$r.trigger('click');
}, 4000));
},
stop: function(){
$.each(player.timer, function(i, timer){
clearInterval(timer);
player.timer.splice(i, 1);
});
}
};
player.start();
$totop.hide();
$(window).scroll(function(){
if ($(this).scrollTop() > 100){
$totop.fadeIn();
} else {
$totop.fadeOut();
}
});
$totop.on({
click: function(){
$('html,body').animate({ scrollTop: 0 }, 500);
}
});
$bun.find('.mov').append(
$.$('header'),
$.$('article')
);
$bun.find('.link').on({
click: function(){
var link = $(this).data('link');
if(getPos($(this)) === 0) location.href = link;
}
});
$bun.children('li').children('header').on({
click: function(){
player.stop();
var
$tar = $(this).parent(),
code = $tar.data('yt'),
tarid = 'video-' + code,
$shell = $tar.children('article').attr('id', tarid);
if($.isMobile.tablet() || $.isMobile.mobile()){
location.href = 'http://youtu.be/' + code;
return false;
}
ytplayer = new YT.Player(tarid,{
width: '100%',
height: '100%',
videoId: code,
playerVars: {
rel: 0,
wmode: 'opaque'
},
events: {
onReady: function(ev){
ev.target.playVideo();
},
onStateChange: function(ev){
// 再生時
if(ev.data === YT.PlayerState.PLAYING){
// 終了又は停止時
} else if(ev.data === YT.PlayerState.ENDED || ev.data === YT.PlayerState.PAUSED) {
$tar.append(
$.$('article')
).children('iframe').animate({ opacity:0 }, 400, function(){
$(this).remove();
});
ytplayer = null;
if(player.timer.length === 0) player.start();
}
}
}
});
$tar.children('iframe').css({ opacity:0 }).animate({ opacity:1 }, 800)
},
mouseover: fadeout,
mouseout: fadein
});
$thumb.children('li').on({
click: function(){
player.stop();
var
$tar = $(this),
pos = getPos($tar);
slide(pos*(-1));
player.start();
}
});
$l.on({
click: function(){
player.stop();
slide(1);
if($.isdefined(ytplayer) && ytplayer !== null) ytplayer.pauseVideo();
player.start();
},
mouseover: fadeout,
mouseout: fadein
});
$r.on({
click: function(){
player.stop();
slide(-1);
if($.isdefined(ytplayer) && ytplayer !== null) ytplayer.pauseVideo();
player.start();
},
mouseover: fadeout,
mouseout: fadein
});
$('#contactform').sendmail('グリーン中部株式会社ホームページからお問い合わせがありました');
});