var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
var pageScripts = {};
$.ajaxSetup({cache:false,data:{l:window.__lang}});
$.ajaxPrefilter("script", function (options, originalOptions, jqXHR) {
if (pageScripts[options.url])
{
jqXHR.abort();
}
else
{
pageScripts[options.url] = true;
options.cache = true;
options.data = null;
}
});
$(function(){
$(document).bindDialogs();
// registerHotkeys();
cachePageScripts();
$('a.toggles').click(function() {
$('a.toggles i').toggleClass('icon-chevron-left icon-chevron-right');
$('#sidebar').animate({width: 'toggle'}, 0);
$('#content').toggleClass('span12 span10');
$('#content').toggleClass('no-sidebar');
});
$('a.grid-action').bindGridActions();
$('#clock').clock();
});
//http://www.stepanreznikov.com/js-shortcuts/
//function registerHotkeys()
//{
// var search = $('input.search-query');
// var goto = function(url){document.location.href = getUrl(url);};
//
// $.Shortcuts
// .add({type:'down',mask:'ctrl+alt+f',enableInInput:true,handler:function(){search.focus();}})
// .add({type:'down',mask:'ctrl+alt+o',enableInInput:true,handler:function(){goto('order/create');}})
// .add({type:'down',mask: 'ctrl+alt+c',enableInInput: true,handler:function(){goto('customer/create');}})
// .add({type:'down',mask: 'ctrl+alt+t',enableInInput: true,handler:function(){goto('timeline/index');}})
// .start();
//}
function cachePageScripts()
{
var base = $('base').attr("href");
var pathIndex = base.indexOf('/', location.protocol.length + 2);
var path = base.substring(pathIndex);
base = base.substring(0, pathIndex);
$("script[src]").each(function(){
var url = $(this).attr('src');
if(url.indexOf('http') == 0) url = url;
else if(url.indexOf('//') == 0) url = location.protocol + url;
else if(url.indexOf('/') == 0) url = base + url;
else url = base + path + url;
pageScripts[url] = true;
});
}
function PrintPreview(prtId)
{
$('#' + prtId).print({
addGlobalStyles : true,
stylesheet : 'media/admin/css/print.css'
});
}
function checkAll(chk, selector)
{
$(selector + ' input:checkbox').each(function(){
$(this).attr('checked', chk.checked);
});
}
function toggle(chk, elmId, inverse)
{
var elm = $('#' + elmId); chk.checked ^ inverse ? elm.show(): elm.hide();
}
function WaitForUserInput(timer,timeOut) {
var d = $.Deferred();
timer.d = (new Date()).getTime();
setTimeout(
function () {
if ((new Date().getTime()) - timer.d >= timeOut) d.resolve();
else d.reject();
},
timeOut + 5
);
return d;
}
// ----- Customer ------------------
function Link2Modal()
{
var href = $(this).attr('href');
var grid = $(this).attr('data-for');
var cache = $(this).attr('data-allow-cache') ? true : false;
var repost = $(this).attr('repost');
openModal(href,grid,cache,repost);
$(this).attr('repost', 1);
return false;
}
/*
dialog can work async, when everything is done, dialog should trigger
action_done event to finalize itself.
*/
function openModal(href, grid, cache, repost)
{
var d = $.Deferred();
$.ajax({
type:'GET',
url:href,
data:{repost:repost},
cache:cache,
success: function(data){
var $container = $("#modal");
$container
.one('action_done', function(event, message){
event.stopPropagation();
$container.modal('hide');
if(grid)
{
$.each(grid.split(','), function(i,gridId){
if($("#" + gridId).length>0) $.fn.yiiGridView.update(gridId);
});
}
d.resolve(message);
})
.html(data)
.one('shown', function(){$("#alert_container").hide().appendTo($container)})
.one('hidden', function(){$("#alert_container").hide().prependTo($("#content"))})
.modal();
}
});
return d;
}
alertSync = {d:new Date()};
/* status: success, error, danger */
function JsAlert(message, status)
{
if(message.length>0)
{
var alert = $("#alert_container");
window.scrollTo(0, 0);
alert.html(
'
'
)
.show();
if(status!='error')
WaitForUserInput(alertSync, 4000).done(function(){alert.fadeOut(500)});
}
}
function AjaxButton()
{
$("#alert_container").html('');
var btn = $(this);
btn.attr('disabled', true);
var sender = btn.attr('id');
var method = btn.attr('data-ajax') == 'GET' ? 'GET' : 'POST';
var f_id = btn.attr('data-form');
var fp_id = btn.attr('data-container');
var f = f_id ? $('#' + f_id) : btn.parents('form');
var fp = fp_id ? $('#' + fp_id) : f.parent();
var url = btn.attr('data-url') || f.attr('action');
function handleResponse(data, status, xhr)
{
btn.attr('disabled', null);
if(typeof data == 'object')
{
if(data.event == 'redirect')
{
document.location.href = data.message;
}
if(data.event == 'alert')
{
JsAlert(data.message, data.status);
}
else if(data.event == 'error' && typeof data.message == 'object')
{
f.refreshErrors(data.message);
}
else
btn.trigger(data.event, [data.message, data.status])
}
else if(typeof data == 'string' && data.length>0)
{
fp.html(data);
}
}
$.ajax({
type:method,
url:url,
data:f.serialize() + "&action_sender=" + sender,
success: handleResponse
});
return false;
}
// ----- Files ----------------------
jQuery.fn.bindFileOperations = function () {
this.each(function () {
var section = $(this);
var fm = $("form", section);
var hdn = $('input[type=hidden]:first', fm);
var list = $("ul", fm);
$('.btn-group input', section).click(function () {
$("input:checkbox", list).attr('checked', this.checked);
});
if(hdn && !isNaN(hdn.val()))
{
list.sortable({
tolerance:'pointer',
opacity : 0.6,
cursor : 'move',
update : function() {
var file_id_order = list.sortable("serialize", {key:'file[]'});
list.sortable("disable");
$.post(getUrl('file/sort/?group_id=') + hdn.val(), file_id_order, function(data){
list.sortable("enable");
});
}
});
bindFileDelete(hdn.val(), fm, list);
}
});
};
function bindFileDelete(group_id, fm, list)
{
var del = $('a.btn-danger', fm);
del.click(function(){
post_data = fm.serialize();
$.post(getUrl('file/bulkdelete/?group_id=') + group_id, post_data, function(data){
list.html(data);
});
return false;
});
}
function queryFiles(sectionId)
{
var section = $("#" + sectionId);
var hdn = $('input[type=hidden]:first', section);
var list = $("ul", section);
if(hdn && !isNaN(hdn.val()))
{
$.get(getUrl('file/query'), {group_id:hdn.val()}, function(data){
list.html(data);
});
}
}
// --------------------------------------------
function orderDetailsPopups()
{
var dWin = $("#order_details");
var self = this;
self.Hash = new Array();
$("#order-grid .icon-info-sign").live({
mouseenter:
function()
{
var order_id = $(this).attr('data-id');
var d = $.Deferred();
var pos = $(this).position();
dWin.css({'top':pos.top,'left':pos.left+20});
if(!self.Hash[order_id])
{
dWin.html('loading...
');
d = $.ajax({
url: getUrl('order/ajaxgrid_details'),
data: {'scenario':'order-view-popup','OrderDetail[order_id]':order_id},
success: function(data) {self.Hash[order_id]=data;}
//,cache:true
//,ifModified:true
});
}
else
{
d.resolve(self.Hash[order_id]);
}
d.done(function(data){
dWin.html(data);
var height = dWin.height();
var expandTop = $(window).height() + $(window).scrollTop() <= pos.top + height + 16;
dWin.css({'top':(expandTop ? pos.top-height-16:pos.top+16)});
});
dWin.show();
},
mouseleave:
function()
{
dWin.hide();
dWin.html('');
}
});
}
function handleDefaultButton()
{
var defaultBtn = null;
var inputTags = ["INPUT", "SELECT"];
function bindButtonToControl(ctrl, btn)
{
if(ctrl.data("default-btn") == undefined)
{
ctrl.focus(function(){
var btn = ctrl.data("default-btn");
btn.addClass('btn-success');
defaultBtn=btn;
}).blur(function(){
var btn = ctrl.data("default-btn");
btn.removeClass('btn-success');
defaultBtn=null;
});
}
ctrl.data("default-btn", btn);
}
$("[data-btn]").each(function(){
var tag = $(this);
var tagName = tag.prop("tagName");
var btn = $("#" + tag.attr("data-btn"));
if(!btn) return;
if(jQuery.inArray(tagName, inputTags)>-1)
bindButtonToControl(tag, btn);
else
$(inputTags.join(","), tag).each(function(){bindButtonToControl($(this), btn);});
});
$("form").keydown(function(e){
if(e.which == 13 && defaultBtn!=null)
{
e.stopPropagation()
e.preventDefault()
var btn = defaultBtn;
btn.focus();
btn.click();
}
});
}
function getTypeAheadOptions(url, hdn_id)
{
return {
source: function(typeahead, query) {WaitForUserInput(typeahead,350).done(function () {
if(query.length<3) return;
$.post(getUrl(url), {q:query}, function(data) {
typeahead.process(data);
},'json');
})},
onselect: function(obj) {$('#'+ hdn_id).val(obj.id).change();},
property: 'summary',
property2: 'name'
};
}
function loadVisualization() {
if(typeof google == "undefined")
{
$.getScript("//www.google.com/jsapi", function(){
google.load("visualization", "1.1", {packages:["corechart"], callback:visualizationReady});
});
}
else
visualizationReady();
function visualizationReady()
{
$(document).trigger('visualization')
}
}
function yiiGridDelete(link,success,data)
{
if(typeof data == 'object')
JsAlert(data.message, data.status);
}
function toggleEnabled(e)
{
var link = $(this);
var href = $(this).attr('href');
var callback = e.data && e.data.callback
? e.data.callback
: function(){this.children(0).toggleClass('icon-ok-circle icon-lock');};
$.get(href, $.proxy(callback, link))
return false;
}
jQuery.fn.center = function () {
this.css("position","absolute");
this.css("top", ( $(window).height() - this.height() ) / 2+$(window).scrollTop() + "px");
this.css("left", ( $(window).width() - this.width() ) / 2+$(window).scrollLeft() + "px");
return this;
}
jQuery.fn.ForceNumericOnly = function () {
return this.each(function () {
$(this).keydown(function (e) {
var key = e.charCode || e.keyCode || 0;
var options = $.extend({}, "00", $(this).attr('data-numonly-options')); /*negative, point*/
// allow backspace, tab, delete, arrows, numbers and keypad numbers ONLY
return (
(e.ctrlKey && key == 86) ||
(options[0]==1 && (key==109 || key==189 || key==173)) ||
(options[1]==1 && key==190) ||
key == 8 ||
key == 9 ||
key == 46 ||
(key >= 37 && key <= 40) ||
(key >= 48 && key <= 57) ||
(key >= 96 && key <= 105));
});
});
};
jQuery.fn.limiter = function(limit, elem) {
$(this).on("keyup focus", function() {
setCount(this, elem);
});
function setCount(src, elem) {
var chars = src.value.length;
if (chars > limit) {
src.value = src.value.substr(0, limit);
chars = limit;
}
elem.html( chars + '/' + limit );
}
setCount($(this)[0], elem);
};
jQuery.fn.preventFormSubmit = function () {
$("input", $(this)).on('keydown', function(e){
if(e.keyCode != 13) return;
e.stopPropagation();
e.preventDefault();
});
};
jQuery.fn.unbindYiiGrid = function() {
if(typeof $.fn.yiiGridView != "undefined")
{
var id = $(this).attr('id');
var setting = $.fn.yiiGridView.settings[id];
if(typeof setting != "undefined")
{
$(document).off('click', '#' + id + ' .' + setting.tableClass + ' > tbody > tr');
$(document).off('click', setting.updateSelector);
}
}
}
jQuery.fn.bindDialogs = function() {
$('a[data-dialog]', $(this)).each(function(){$(this).live('click', window[$(this).attr('data-dialog')])});
}
// -------- History methods ----------
String.prototype.deparamUrl = function()
{
return $.deparam.querystring(this.indexOf('?')>=0 ? this.split('?')[1] : this);
}
$.extend({
clearEmpty: function(params) {
$.each(params, function( key, val ) {
if(typeof val == "object") $.clearEmpty(val);
else if(!val) delete params[key];
})
}
});
function clearFilters(btn)
{
var grid = $(btn).closest('div.grid-view');
var grid_id = grid.attr('id');
var ctrls = $(btn).closest('tr.filters').find('input, select');
ctrls.each(function(){$(this).prop('value', '');});
yiiGridSaveHistory(grid_id, ctrls.serialize().deparamUrl());
}
function yiiGridSaveHistory(id, params)
{
$.clearEmpty(params);
delete params['_'];
delete params['ajax'];
if(window.History.enabled)
window.History.replaceState(null, document.title, decodeURIComponent($.param.querystring(document.location.href, params)));
$('#' + id).yiiGridView('update', {data: params});
}
function bootstrapAjaxTabs(e)
{
var tab = $(e.target);
var url = tab.attr('data-ajax');
if(url)
{
tab.attr('data-ajax', null);
var div = $(tab.attr('href'));
div.html('loading...
').load(url);
}
if(window.History.enabled)
{
var c = tab.closest('div.boot-tabs');
var key = c.attr('id');
var val = tab.attr('href').substring(1);
var params = new Object;
params[key] = val;
window.History.replaceState(null, document.title, decodeURIComponent($.param.querystring(document.location.href, params)));
}
}
jQuery.fn.activateBootTab = function ()
{
if(!window.History.enabled) return;
var params = document.location.href.deparamUrl();
var el = $(this);
var el_id = el.attr('id');
if(params[el_id])
{
var tab = $('a[href=#' + params[el_id] + "]", el);
if(tab)
tab.tab('show').show();
}
};
function updateEstimation(data)
{
var ul = $('#estimate');
$('li.aCenter',ul).remove();
$.each(data,function(c,i){
ul.append("{2} ".format(c,i[1],i[0]));
})
}
function uploadFile(uploadUrl, form)
{
var btn = $(this);
btn.attr('disabled', true);
var data = new FormData();
form.find('input[name="upload[]"]').remove();
form.find('input:file').each(function(){
$.each(this.files, function(idx,file){
data.append('upload[]', file, 10);
});
});
$.ajax({
url: uploadUrl,
type: 'POST',
data: data,
dataType: 'json',
cache: false,
processData: false,
contentType: false
})
.done(function(data){
$.each(data.message, function(idx,filename){
$(' ').attr({type:'hidden',name:'upload[]',value:filename}).appendTo(form);
});
AjaxButton.call(btn);
});
}
function searchBarcode(barcode, office, cb_success)
{
$.getJSON(getUrl('product/barcode'), { barcode: barcode, office:office})
.done(function(p) {
if(p) cb_success.call(this, p);
else JsAlert('Barcode: ' + barcode + ' not found', 'warning');
});
}