# Module:Footnotes

f = {  
args_default = {  
bracket_left = "",  
bracket_right = "",  
bracket_year_left = "",  
bracket_year_right = "",  
postscript = "",  
page = "",  
pages = "",  
location = "",  
page_sep = ", ப.&nbsp;",  
pages_sep = ", ப.&nbsp;",  
ref = "",  
P1 = "",  
P2 = "",  
P3 = "",  
P4 = "",  
P5 = ""  
}  
};  

function trim( str )  
if str == nil then  
return nil;  
end  
return str:match( "^%s*(.-)%s*$");  
end  

function core( args )  
local result;  

if args.P5 ~= "" then  
result = args.P1 .. ' et al. ' .. args.bracket_year_left .. args.P5 ..  
args.bracket_year_right;  
elseif args.P4 ~= "" then  
result = args.P1 .. ', ' .. args.P2 .. ' &amp; ' .. args.P3 .. ' ' ..  
args.bracket_year_left .. args.P4 .. args.bracket_year_right;  
elseif args.P3 ~= "" then  
result = args.P1 .. ' &amp; ' .. args.P2 .. ' ' .. args.bracket_year_left ..  
args.P3 .. args.bracket_year_right;  
else  
result = trim( args.P1 .. ' ' .. args.bracket_year_left .. args.P2 ..  
args.bracket_year_right )  
end  

if args.ref ~= '' then  
if args.ref ~= "" then  
result = "" .. result .. "";  
else  
result = "" .. result .. "";  
end  
end  

if args.page ~= "" then  
result = result .. args.page_sep .. args.page;  
elseif args.pages ~= "" then  
result = result .. args.pages_sep .. args.pages;  
end  

if args.location ~= "" then  
result = result .. ", " .. args.location;  
end  

result = args.bracket_left .. result .. args.bracket_right .. args.postscript;  
return result;  
end  

function f.harvard_core  
local args = {};  
local pframe = :getParent;  

args.bracket_left = pframe.args.BracketLeft or "";  
args.bracket_right = pframe.args.BracketRight or "";  
args.bracket_year_left = pframe.args.BracketYearLeft or "";  
args.bracket_year_right = pframe.args.BracketYearRight or "";  
args.postscript = pframe.args.Postscript or "";  
if '' == args.postscript then  
args.postscript = '';  
end  

args.page = pframe.args.Page or "";  
args.pages = pframe.args.Pages or "";  
args.location = pframe.args.Location or "";  
args.page_sep = pframe.args.PageSep or "";  
args.pages_sep = pframe.args.PagesSep or "";  
args.ref = pframe.args.REF or "}";  
args.P1 = trim( pframe.args.P1 ) or "";  
args.P2 = trim( pframe.args.P2 ) or "";  
args.P3 = trim( pframe.args.P3 ) or "";  
args.P4 = trim( pframe.args.P4 ) or "";  
args.P5 = trim( pframe.args.P5 ) or "";  

return core( args );  
end  

function f.harvard_citation  
local args = f.args_default;  
pframe = :getParent;  

args.bracket_left = "(";  
args.bracket_right = ")";  
args.page = pframe.args.p or pframe.args.page or "";  
args.pages = pframe.args.pp or pframe.args.pages or "";  
args.location = pframe.args.loc or "";  
args.ref = pframe.args.ref or pframe.args.Ref or "";  
args.P1 = trim( pframe.args[1] ) or "";  
args.P2 = trim( pframe.args[2] ) or "";  
args.P3 = trim( pframe.args[3] ) or "";  
args.P4 = trim( pframe.args[4] ) or "";  
args.P5 = trim( pframe.args[5] ) or "";  

return core( args );  
end  

function f.harvard_citation_no_bracket  
local args = f.args_default;  
pframe = :getParent;  

args.page = pframe.args.p or pframe.args.page or "";  
args.pages = pframe.args.pp or pframe.args.pages or "";  
args.location = pframe.args.loc or "";  
args.ref = pframe.args.ref or pframe.args.Ref or "";  
args.P1 = trim( pframe.args[1] ) or "";  
args.P2 = trim( pframe.args[2] ) or "";  
args.P3 = trim( pframe.args[3] ) or "";  
args.P4 = trim( pframe.args[4] ) or "";  
args.P5 = trim( pframe.args[5] ) or "";  

return core( args );  
end  

function f.sfn  
local args = f.args_default;  
for k, v in pairs( .args ) do -- for , override default with values provided in the #invoke:  
args[k] = v;  
end  

pframe = :getParent;  

args.postscript = pframe.args.postscript or pframe.args.ps or ".";  
if '' == args.postscript then  
args.postscript = '';  
end  
args.page = pframe.args.p or pframe.args.page or "";  
args.pages = pframe.args.pp or pframe.args.pages or "";  
args.location = pframe.args.loc or "";  
args.ref = pframe.args.ref or pframe.args.Ref or "";  
args.P1 = trim( pframe.args[1] ) or "";  
args.P2 = trim( pframe.args[2] ) or "";  
args.P3 = trim( pframe.args[3] ) or "";  
args.P4 = trim( pframe.args[4] ) or "";  
args.P5 = trim( pframe.args[5] ) or "";  

local result = core( args );  
local name = "FOOTNOTE" .. args.P1 .. args.P2 ..  
args.P3 .. args.P4 .. args.P5 .. args.page .. args.pages .. args.location;  

result = :extensionTag{ name = "ref", args = {name=name}, content=result };  

return result;  
end  

return f;